admin 管理员组

文章数量: 1184232


2024年4月15日发(作者:bat星空粒子特效代码)

mysql性能优化

1.配置优化

MySQL 5.7版本默认的最大连接数是151个,这个值可以再

中去修改。

的执行优化

慢SQL的定位和排查,我们可以通过慢查询日志和慢查询日志工

具分析,得到有问题的SQL列表

执行计划分析,针对慢SQL我们可以使用关键字explain来去查

看当前sql的执行计划,可重点关注type,key,rows,filterd等

字段,从而去定位该SQL执行慢的根本原因,再去有的放矢的进行优

使用show profile工具,这个工具是MySQL提供的可以用来分

析当前会话中SQL语句资源消耗情况的工具,可以用于SQL调优的测

量,在当前会话中,默认情况下,show profile是关闭状态,打开

以后会保存,最近15次的运行结果,针对运行慢的SQL通过profile

工具进行详细分析,可以得到SQL执行过程中所有资源的开销情况,

比如io开销,cpu开销,内存开销

3. 架构设计层面的优化

MySQL是一个磁盘IO访问,非常频繁的关系型数据库,在高并

发和高性能的场景中,MySQL数据库必然会承受巨大的并发压力,在

此时我们的优化的方式,主要可以分为几个部分:

(1) 第一个是搭建MySQL主从集群,单个MySQL服务容易去导

致单点故障,一旦服务宕机,将会导致依赖MySQL数据库的应用,全

部无法响应,主从集群或者主主集群,都可以去保证服务的高可用性。

(2) 读写分离设计,在读多写少的场景中,通过读写分离的方

案,可以去避免读写冲突,导致的性能问题。

(3) 引入分库分表的机制,通过分库可以降低单个服务器一个

IO压力。通过分表的方式,降低单表数据量,从而去提升sql的查

询效率。

(4) 针对热点数据,可以引入更为高效的分布式数据库,如

Redis、MongoDB等,他们可以很好的减轻MySQL的访问压力,同时

还能提升数据的检索性能

4. MySQL程序配置优化

MYSQL是一个经过互联网大厂检验过的生产级别的成熟数据库,

对于MySQL数据库本身的优化,一般可以通过MySQL配置文件

来完成。

第一个MySQL 5.7版本默认的最大连接数是151个,这个值可以

再中去修改。

第二个binlog日志默认不开启,可以开启。

第三个是缓存池Bufferpool默认大小配置,而这些配置一般是

和用户的安装环境以及使用场景有关系,因此这些配置,官方只会提

供一个默认的配置,具体的情况还需要使用者去根据实际情况去修改。

关于配置项的修改,需要关注两个层面,第一个是配置的作用域,

它可以分为会话级别和全局范围。第二个是是否支持热加载,针对这

两个点,我们需要注意的是,全局参数的设定,对于已经存在的会话

是无法生效的,会话参数的设定,随着会话的销毁而失效。第三个是

全局类的统一配置,建议配置在默认配置文件中,否则重启服务会导

致配置失效。

5、选择最合适的字段属性

Mysql是一种关系型数据库,可以很好地支持大数据量的存储,

但是一般来说,数据库中的表越小,在它上面执行的查询也就越快。

因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段

的宽度舍得尽可能小。

6、尽量把字段设置为NOT NULL

在可能的情况下,尽量把字段设置为NOT NULL,这样在将来执行

查询的时候,数据库不用去比较NULL值。

对于某些文本字段来说,例如“省份”或者“性别”,我们可以

将他们定义为ENUM(枚举)类型。因为在MySQL中,ENUM类型被当做

数值型数据来处理,而数值型数据被处理起来的速度要比文本类型要

快得多。这样我们又可以提高数据库的性能。

7、使用连接(JOIN)来代替子查询(Sub-Queries)

MySQL从4.1开始支持SQL的子查询。这个技术可以使用select

语句来创建一个单例的查询结果,然后把这个结果作为过滤条件用在

另一个查询中。

例如:我们要将客户基本信息表中没有任何订单的客户删除掉,

就可以利用子查询先从销售信息表中将所有发出订单的客户id取出

来,然后将结果传递给主查询,如下图所示:

如果使用连接(JOIN)来完成这个工作,速度将会快很多,尤其是

当salesinfo表中对CustomerID建有索引的话,性能将会更好,查

询如下:

连接(JOIN)之所以更有效率一些,是因为MySQL不需要在内存中

创建临时表来完成这个逻辑上 需要两个步骤的查询工作。

另外,如果你的应用程序有很多JOIN查询,你应该确认两个表

中JOIN的字段是被建立过索引的。这样MySQL内部 会启动为你优化

JOIN的SQL语句的机制。而且这些被用来JOIN的字段,应该是相同

的类型的。

8、使用联合(UNION)来代替手动创建的临时表

MySQL从4.0版本开始支持union查询,他可以把需要使用临时

表的两条或更多的select查询合在一个查询中。在客户端查询会话

结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。使

用union来创建查询的时候,我们只需要用union作为关键字把多个

select语句连接起来就可以了,要注意的是所有select语句中的字

段数目要相同。


本文标签: 查询 配置 数据库 需要 情况