# MySQL 慢查询日志

# 慢查询日志作用

  • 慢查询日志会把查询耗时,超过规定时间的 SQL 语句记录下来
  • 利用慢查询日志,定位分析性能的瓶颈

默认情况下,MySQL 是不启用慢查询日志的。

show variables like 'slow_query%';
1
Variable_name Value
slow_query_log OFF
slow_query_log_file /usr/local/mysql/sql_log/slowlog.log

slow_query_log:慢查询开启状态

slow_query_log_file:慢查询日志存放位置

# 开启慢查询日志

# 开启慢查询日志
slow_query_log=ON
# 查询超时时间,单位 秒
long_query_time=1
1
2
3
4

还可以参考笔者的另一文章学习慢查询的知识

除了配置文件,还可以使当次 mysql 运行期间生效的配置方式,运行以下语句

set global slow_query_log=on;
1

使用语句来运行超过 1 秒钟,来查看慢查询日志信息

select sleep(2);  -- 休眠 2 秒钟
1

慢查询日志文件 /usr/local/mysql/sql\_log/slowlog.log

# Time: 2020-06-12T03:44:19.415383Z
# User@Host: root[root] @ gateway [192.168.56.1]  Id:     8
# Query_time: 2.000411  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
use neti;
SET timestamp=1591933457;
/* ApplicationName=DataGrip 2020.1.4 */ select sleep(2);
1
2
3
4
5
6

# EXPLAIN

从慢查询日志看到那些 SQL 语句查询慢,那么可以通过 explain 针对这些语句进行执行计划的查看,然后分析它为什么这么慢

explain
select id, dname
from t_dept;
1
2
3

执行计划为

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t_dept NULL index NULL unq_dname 802 NULL 7 100 Using index

这里 type=index 说明使用了索引,并使用了索引 kye=unq_dname,返回了 rows=7 行数据;

如果这里 type=all,那么就是全表扫描,可以考虑优化它,让它走索引

explain
select id, dname
from t_dept
where id = 10;
1
2
3
4

执行计划为

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t_dept NULL const PRIMARY PRIMARY 4 const 1 100 NULL

这一条,根据主键 ID 查询的