mysql慢查询处理

93 阅读2分钟

本文正在参加「技术专题19期 漫谈数据库技术」活动

当我们实际工作中,经常碰到某个功能或者某个接口需要很久才能返回结果,有时候我们怀疑是网络问题,如果排除了网络问题,我们们就应该去确定是不是慢查询导致的。

1.定位慢查询主要的两种方式

  • 查看慢查询日志确定已经执行完的慢查询
  • show processlist 查看正在执行的慢查询

2.查看是否开启慢日志查询

show GLOBAL VARIABLES LIKE "slow_query_log"  

查询结果:默认是关闭的
image.png 开启慢查询日志:

set global slow_query_log = on;  

开启之后:
image.png

3.查看设置慢查询时间阀值(单位是秒)

show GLOBAL VARIABLES LIKE "long_query_time"  

image.png
设置慢查询时间阀值:

set global long_query_time = 1;  

设置之后:
image.png
一般测试环境建议 long_query_time 设置的阀值比生产环境的小,比如生产环境是 1 秒,则测试环境建议配置成 0.5 秒。便于在测试环境及时发现一些效率低的 SQL。

4.确定慢查询日志文件路径

show global variables like "datadir"  

结果如下:
image.png

5.确定慢查询日志文件名字

show global variables like "slow_query_log_file"  

结果如下:
image.png

6.show processlist查看正在执行慢查询的语句

有时慢查询正在执行,已经导致数据库负载偏高了,而由于慢查询还没执行完,因此慢查询日志还看不到任何语句。此时可以使用 show processlist 命令判断正在执行的慢查询。show processlist 显示哪些线程正在运行。
image.png
这里对上面结果解释一下:

  • Time:表示执行时间
  • Info:表示 SQL 语句
    我们可以通过Time字段来判断执行的查询是不是慢查询

7.慢查询分析

准备数据包t1
image.png
分析查询结果:
采用explain关键字,可以分析查询语句的执行信息
image.png
分析一下字段
image.png
type字段
image.png