如何定位并优化慢SQL查询
1. 根据慢日志定位慢查询sql
使用SQL命令查询慢日志设置
SHOW VARIABLES LIKE '%QUERY%';
最后两个变量slow_query_log和slow_query_log_file即和慢日志有关,第一个变量控制是否开启慢日志,第二个变量定义慢日志存储位置。
超过long_query_time时间等查询会被记录在慢日志中。
开启慢查询命令
打开慢查询:
SET GLOBAL slow_query_log = ON;设置慢查询时间:
SET GLOBAL long_query_time = 1;直接使用命令设置数据库重启后会还原,想要永久需要到my.cnf配置文件中去设置。
使用sql命令查询慢日志状态
SHOW STATUS like '%slow_queries%';
Slow_queries显示慢查询记录条数。
2. 使用explain等工具分析sql
在命令前加explian即可分析
例如:
EXPLAIN SELECT `name` FROM person_info_large ORDER BY name desc;
其中id表示执行顺序,对于复合查询来说id越大越先执行。
-
type表示mysql找到需要的数据行的方式,方式性能从最优到最差如图所示:
index和all表明走的是全表扫描,故非常慢。 -
Extra:
3. 修改sql或者尽量让sql走索引
改sql
例如命令:
SELECT `name` FROM person_info_large ORDER BY name desc;由于name没有走索引,故可以把name改成count等有索引的项目
加索引
alter table person_info_large add index idx_name(name);