开发同学或多或少会遇到系统响应慢的问题,除了业务系统本身的问题外,常常会遇到SQL查询慢
的问题,这篇文章结合实际案例分析MySQL InnoDB存储引擎的索引优化,这篇文章不会介绍B+
树的知识点,如果需要了解聚集索引和辅助索引特点的同学可以参考这篇文章,这篇文章主要会介绍三星索引
和ICP优化
.
如何分析SQL性能
首先是查看MySQL的状态,系统是否正常,常用的几个命令如下:
#显示状态信息(扩展show status like ‘XXX’)
Mysql> show status;
#显示系统变量(扩展show variables like ‘XXX’)
Mysql> show variablesG;
#显示InnoDB存储引擎的状态
Mysql> show engine innodb statusG;
#查看当前SQL执行,包括执行状态、是否锁表等
Mysql> show processlist ;
第二步是找出系统有哪些慢查询SQL,这个要通过slowLog来查询,首先开启慢查询日志,然后在对应日志路径找到mysql-slow.log,相关命令如下所示:
# 检查是否开启慢查询日志
show variables like '%slow%';
# 如果没有开启,也可以在运行时动态开启这个参数
set global slow_query_log=ON;
# 设置慢查询记录查询耗时多长的SQL,这里设置成100毫秒
set long_query_time = 0.1;
# 这里休眠500毫秒试一下慢查询日志是否会记录
select sleep(0.5)
找到了慢SQL后比较常见的做法就是用explain命令分析SQL执行计划,查看SQL语句是否命中了索引,explain的用法可以参考MySQL 性能优化神器 Explain 使用分析,在优化过程中我们可能需要看到优化前后的查询时间对比,这时候可以打开profiling开关,查看某条SQL语句的执行耗时情况,分析是哪个步骤耗时较长,相关设置如下:
# 查看是否开启profiling
select @@profiling;
# 开profiling,注意测试完关闭该特性,否则耗费资源
set profiling=1;
# 查看所有记录profile的SQL
show profiles;
# 查看指定ID的SQL的详情
show profile for query 1;
# 测试完,关闭该特性
set profiling=0;