谈谈你对MySQL性能优化的理解?

一、硬件和操作系统层面的优化

从硬件层面来说,影响MySQL性能因素主要是CPU、可用内存大小、磁盘读写速度、网络带宽。

从操作系统层面来说,影响MySQL性能因素主要是应用文件句柄数、操作系统的网络配置。

这个部分的优化一般是由DBA或者运维工程师来完成。在硬件基础资源的优化中,我们重点应该关注的是服务本身所承载的体量,然后提出合理的指标要求,避免出现资源浪费的一个现象。

二、架构设计层面的优化

MySQL是一个磁盘IO访问非常频繁的关系型数据库,在高并发和高性能的场景中,MySQL数据库必然会承受巨大的并发压力。在此时我们优化的方式主要可以分为几个部分:第一个是搭建MySQL主从集群,单个MySQL服务容易去导致单点故障,一旦服务宕机,将会导致依赖MySQL数据库的应用全部无法响应,主从集群或者主主集群都可以去保证服务的高可用性。第二个是读写分离设计,在读多写少的场景中,通过读写分离的方案可以去避免读写冲突导致的性能问题。第三个是引入分库分表的机制,通过分库可以降低单个服务器节省的一个IO压力,通过分表可以去降低单表数据量从而去提升sql查询效率。第四个是针对热点数据可以引入更为高效的分布数据库,比如说像Redis、MongoDB等,它们可以很好的缓解MySQL的访问压力,同时还能提升数据的检索性能。

三、MySQL程序配置优化

MySQL是一个经过互联网大厂检验过的生产级别的成熟数据库,对MySQL数据库本身的优化一般可以通过MySQL配置文件my.cnf来完成。比如说MySQL5.7版本,默认的最大连接数是151个,这个值可以在my.cnf中去修改。第二个binlog日志默认是不开启,我们也可以在这个文件中去修改。第三个是缓存池Bufferpool默认大小配置等。而这些配置一般是和用户的安装环境以及使用场景有关系,因此这些配置官方只会提供一个默认配置,具体的情况还是得由使用者去根据实际情况去修改。关于配置项的修改需要关注两个层面,第一个是配置的作用域,它可以分为会话级别和全局范围;第二个是是否支持热加载,因此针对这两个点我们需要注意的是全局参数的设定对于已经存在的会话是无法生效的,会话参数的设定随着会话的销毁而失效;第三个是全局类的统一配置建议配置在默认配置文件中,否则重启服务会导致配置失效。

四、SQL执行优化

第一个是慢SQL的定位和排查,我们可以通过慢查询日志和慢查询日志工具分析得到有问题的SQL列表。

第二个是执行计划分析,针对慢的SQL我们可以使用关键字Explain来去查看当前sql的执行计划,可以重点关注type、key、rows、filterd等字段,从而去定位该SQL执行慢的根本原因,再去有的放矢的进行优化。

第三个是使用show profile工具,show profile工具是MySQL提供的可以用来分析当前会话中SQL语句资源消耗情况的工具,可以用于SQL调优的测量。在当前会话中默认情况下show profile是关闭状态,打开之后会保存最近15次的运行结果,针对运行慢的SQL通过profile工具进行详细分析可以得到SQL执行过程中所有资源的开销情况,如IO开销、CPU开销、内存开销等等。

常见的SQL优化的规则:

1、SQL的查询一定要基于索引来进行数据扫描

2、避免索引列上使用函数或者运算符,这样会导致索引失效

3、where查询条件的like %号尽量放置在右边

4、使用索引扫描,联合索引中的列从左往右,命中越多越好

5、尽可能使用SQL语句用到的索引完成排序,避免使用文件的排序方式

6、查询有效的列信息即可,少用*代替列信息

7、永远要用小结果集驱动大结果集