1.硬件和操作系统层面的优化
从硬件层面来说:
影响MySQL性能因素主要是cpu可用内存大小、磁盘读写速度、网络带宽
从操作层面来说:
应用文件句柄数、操作系统的网络配置都会影响到MySQL的性能,这部分的优化一般是由DBA或者运维工程师去完成,在硬件基础资源的优化中,我们重点应该关注都是服务本身所承载的体量,然后提出合理的指标要求,避免出现资源浪费的一个现象;
2.架构设计层面的优化
MySQL是一个磁盘IO访问非常频繁的关系型数据库,在高并发和高性能的场景中MySQL数据库必然会承受巨大的并发压力,在此时我们的优化方式,主要可以分为搭建MySQL主从集群---单个MySQL服务容易去导致单点故障,一旦服务宕机将会导致依赖MySQL数据库的应用全部无法响应,而主从集群或者主主集群都可以去保证服务的高可用性。
第二个读写分离设计---在读多写少的场景中通过读写分离的方案可以去避免读写冲突导致的性能问题。
第三个是引入分库分表的机制---通过分库可以降低单个服务器节省的一个IO压力、通过分表的方式可以去降低单表数据量,从而去提升SQL查询效率。
第四个针对热点数据可以引入高效的分布数据库,比如说像Redis、MongoDB等;它们可以很好的缓解MySQL的访问压力,同时还能提升数据的检索性能
3.MySQL程序配置优化
一般可以通过MySQL配置文件my.cnf来完成,比如说MySQL15.7版本默认的最大连接数是151个,这个值可以在my.cnf中去修改;
第二个binlog日志默认是不开启,我们也可以在这个文件中去修改开启
第三个是缓存池Bufferpool默认大小配置等,而这些配置一般是和用户的安装环境以及使用场景有关系,所以这些配置官方只会提供一个默认的配置,具体的情景还是得有使用者去根据实际情况去修改
关于配置项的修改需要关注这三个层面
第一个是配置的作用域
它可以分为会话级别和全局范围;
第二个是是否支持热加载;针对这两个点我们应该注意全局参数的设定,对于已经存在的会话是无法生效的,会话参数的设定随着会话的销毁而失效;
第三个是全局类的统一配置---建议配置在默认配置文件中,否则重启服务会导致配置失效
4.SQL执行优化
可以分为三个步骤:
第一个---慢SQL的定位和排查,我们可以通过慢查询日志和慢查询日志工具分析得到有问题的SQL列表;
第二个是执行计划分析---针对慢的SQL我们可以使用关键字explain来去查看当前SQL的执行计划,可以重点关注type、key、rows、filterd等字段,从而去定位该SQL执行慢的根本原因,再去有的放矢的进行优化
第三个是使用Show Profile工具,Show Profile工具是MySQL提供可以用来分析当前会话中SQL语句资源消耗情况的工具,可以用于SQL调优的测量,在当前会话中默认情况下Show Profile是关闭状态,打开之后会保存最近15次的运行结果,针对运行慢的SQL
通过Show Profile工具进行详细分析可以得到SQL执行过程中所有资源的开销情况,比如IO开销、CPU开销、内存开销等
常见的SQL优化规则
1.SQL的查询一定要基于索引来进行数据扫描
2.避免索引列上使用函数或者运算符,这样会导致索引失效
3.where字句中like%号尽量放置在右边
4.使用索引扫描,联合索引中的列从左往右,命中越多越好
5.尽可能使用SQL语句用到的索引完成排序,避免使用文件排序的方式
6.查询语句里面尽量少用*,而是要用具体有效的列来代替
7.永远用小结果集驱动大结果集