MySQL提供了慢查询可以快速定位性能瓶颈,这篇文章通过具体的示例来介绍一下如何设定方法。
基础知识
慢查询是MySQL的一种基本日志,详细信息可参看。
使用示例
接下来在一个具体的调优示例中展示一下如何使用慢查询
确认慢查询状态
可以看到缺省状态下,慢查询是关闭的状态。
mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | OFF |
+----------------+-------+
1 row in set (0.01 sec)
mysql>
mysql> set global slow_query_log=1;
Query OK, 0 rows affected (0.02 sec)
mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | ON |
+----------------+-------+
1 row in set (0.01 sec)
mysql>
- 10
- 11
- 12
而查询日志的详细信息保存在slow_query_log_file所设定的文件里
mysql> show variables like 'slow_query_log_file';
+---------------------+--------------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------------+
| slow_query_log_file | /var/lib/mysql/6436efce6f31-slow.log |
+---------------------+--------------------------------------+
1 row in set (0.00 sec)
mysql>
此文件缺省状况下会放到mysql数据目录下,名称为hostname-slow.log,由于本文示例的mysql在容器中运行,所以显示的日志名称为6436efce6f31-slow.log,此时刚刚打开,可以确认已经生成了如下内容:
# cat /var/lib/mysql/6436efce6f31-slow.log
mysqld, Version: 5.7.16 (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
#
- 1
- 2
- 3
- 4
- 5
设定阈值
从生成的慢查询日志并未看到有用的信息,慢查询的定义,多慢算慢,则是通过long_query_time来确认的,该值的单位为秒。
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.01 sec)
mysql>
由于缺省值设定为10秒,对于数据库操作超过10秒的非常之少,所以没有看到有用的信息,接下来我们将此值设定为200毫秒,即0.2
mysql> set global long_query_time=0.2;
Query OK, 0 rows affected (0.00 sec)
mysql>
- 1
- 2
- 3
- 4
退出当前的mysql终端,重新进入并确认,发现已经生效
mysql> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.200000 |
+-----------------+----------+
1 row in set (0.00 sec)
mysql>
- 修改配置文件
- 官方的mysql镜像配置文件:/etc/mysql/mysql.conf.d/mysqld.cnf
- 建议设定示例(数据库操作超过100毫秒认为是慢查询,可根据需要进行设定,如果过多,可逐步设定,比如先行设定为2秒,逐渐降低来确认瓶颈所在)
设定建议
为了能够持久化的保持,而不至于重启或者容器重新生成后恢复默认状态,需要设定到配置文件中。
# slow query setting
slow_query_log=1
long_query_time=0.1
- 1
- 2
- 3