如何定位并优化慢查询sql

1.根据慢日志定位慢查询sql

使用以下命令查看相关系统变量属性:

show variables like '%query%';

主要看这三个属性:

  • long_query_time : 10.000000:查询超过10秒被定义为慢语句
  • slow_query_log : OFF:是否打开慢查询日志
  • slow_query_log_file : /usr/local/mysql/data/slow.sql:慢查询文件所在位置

使用以下命令设置这些属性值:

set global slow_query_log = ON; # 打开慢查询日志
set global long_query_time = 1; # 超过1秒的语句被定义为慢语句,注意设置了之后需要重新连接才有效

使用以下命令查询慢查询日志的数量:

show status like '%slow_queries%';

要查看慢日志,直接打开 slow.sql 文件查看即可:

sudo vim /usr/local/mysql/data/slow.sql

2.使用 explain 等工具分析sql

查询出慢语句后可以通过 explain 工具分析sql:

explain select name from person_info_large order by name desc;

查询结果:

balabala...

这里主要注意这几个字段:

type: 表示mysql找到数据行的方式,性能从最优到最差排序如下,如果出现 index 或者 all 就需要注意优化了。

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all

extra: extra中出现以下两项意味着mysql不能使用索引,效率会受到重大影响,应当尽可能优化。

  • Using filesort:表示mysql会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容。可能在磁盘或是在内存上排序。Mysql中无法利用索引完成的排序操作称为“文件排序”。
  • Using temporary:表示mysql在对查询结果排序时使用了临时表。常见于排序和分组查询。

3.修改 sql 或者尽量让 sql 走索引

这一步具体语句具体分析了,主要就是要么使用索引要么修改sql逻辑,还要注意是否语句会走错索引,因为mysql查询优化器会误使用非预期索引导致语句查询缓慢,这时候需要修改sql逻辑引导优化器使用正确的索引,或者强制(force index)使用我们预期的索引

你可能感兴趣的:(MySQL)