MySQL - 慢查询日志

概述

MySQL 慢查询日志是排查问题 SQL 语句,以及检查当前 MySQL 性能的一个重要手段。默认情况下,MySQL 并不启动慢查询日志,需要我们手动来开启。如果不是调优需要的话,一般不建议开启慢查询,毕竟开启慢查询或多或少会带来一定的性能影响。

关键参数

  • slow_query_log: 是否开启慢查询日志,默认 OFF,开启则设置为 ON。
  • slow_query_log_file: 慢查询日志文件存储位置。
  • long_query_time: 超过多少秒的查询才会记录到日志中。单位是秒。
  • log_queries_not_using_indexes: 是否把没有使用到索引的 SQL 记录到日志中,默认 OFF,开启则设置为 ON。

配置

默认情况下是没有开启慢查询日志,下面通过两种配置方式进行设置。

临时配置

1
2
3
4
5
6
7
8
mysql> set global slow_query_log='ON';
Query OK, 0 rows affected (0.00 sec)

mysql> set global slow_query_log_file='/var/lib/mysql/instance-1-slow.log';
Query OK, 0 rows affected (0.00 sec)

mysql> set global long_query_time=2; # 下次会话才会生效
Query OK, 0 rows affected (0.00 sec)

永久配置

1
2
3
4
5
/etc/mysql/conf.d/mysql.cnf
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/lib/mysql/instance-1-slow.log
long_query_time = 2

配置好慢 SQL 相关参数后,重启 MySQL 即可。

查看慢查询功能

1
2
3
4
5
6
7
8
mysql> show variables like 'slow_query%';
+---------------------+----------------------------------+
| Variable_name | Value |
+---------------------+----------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/mysql001-slow.log |
+---------------------+----------------------------------+
2 rows in set (0.05 sec)
1
2
3
4
5
6
7
mysql> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set (0.02 sec)
1
2
3
4
5
6
7
mysql> show variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF |
+-------------------------------+-------+
1 row in set (0.01 sec)

mysqldumpslow

mysqldumpslow 是 MySQL 官方提供的慢查询日志分析工具,使用 mysqldumpslow 命令可以非常明确的得到各种我们需要的查询语句。

小结

慢查询日志是排查SQL问题以及优化的重要手段,在生产环境中一般都会实时采集慢查询日志,对 MySQL 查询语句监控、分析。