一、根据慢日志定位慢查询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为有索引字段名;
走不同的索引效率各有不同,需要具体情况具体分析测试具体择优使用。