mysql慢查询定位

lz 1年前 ⋅ 867 阅读

一、根据慢日志定位慢查询sql

1、查询慢日志的数量

执行语句:show status like "%slow_queries%",(只记录本次会话的慢mysql语句条数);

2、执行mysql语句:show variables like "%quer%"

查询出的信息中主要关注字段slow_query_log(慢日志OFF关闭,ON开启)、long_query_time(sql语句超过规定的时间记录 入慢日志)、slow_query_log_file(慢日志的记录信息文件所在目录);
3、修改(一:2)步骤中关注的字段的设置

设置打开慢日志:set global slow_query_log = on,(设置后需要重新连接mysql客户端);

设置规定的时间:set global long_query_time = 2,(2秒,超过两秒查询就会记录到slow_query_log_file目录);

可以在mysql配置文件去配置这样可以永久保存;
二、使用explain工具分析sql语句(explain外还有其他工具)

 假设分析语句:select name from students_table order by name desc;

      explain分析:explain select name from students_table order by name desc;

分析出来的信息这里只关注

id(复合查询中id越大越先执行)、

type(有多个值,自行了解,index和all表示是全表查询效率 低)、

extra(值为 Using filesort 或者 Using temporary 意为mysql根本不能使用索引,从而效率受到影响。

Using filesort:表示mysql会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容,可能在内存或磁盘上进行排序。mysql中无法利用索引完成的排序操作称为“文件排序”;

Using temporary:表示mysql在对查询结果排序时使用临时表。常见于排序order by 和分组查询group by。)、key(走索引的字段);
 语句执行的时间以慢日志的记录时间为准。

三、修改sql语句或者尽量让sql语句走索引

 给name字段加索引:alter table students_table add index idx_name(name),或者改为有索引的字段查询。

扩展:

explain select count(id) from students_table force index(primary);

语句后面的 force index(primary)表示强制走主键索引,primay为有索引字段名;

走不同的索引效率各有不同,需要具体情况具体分析测试具体择优使用。

 

版权 本文为TIMO社区原创文章,转载无需和我联系,但请注明来自TIMO社区 http://timo.aikanmv.cn