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