MySQL的慢查询使用与分析
一、查看慢查询功能状态
-
查看慢查询状态
通过查看MySQL的slow_query_log
变量,查看慢查询是否已经开启。show variables like 'slow_query_log';
示例:
mysql> show variables like 'slow_query_log'; +----------------+-------+ | Variable_name | Value | +----------------+-------+ | slow_query_log | ON | +----------------+-------+ 1 row in set, 1 warning (0.01 sec)
当前已经开启了慢查询日志。
-
查看慢查询日志的时间
那么,MySQL查询多久算是慢查询呢,可以通过long_query_time
来展示。show variables like 'long_query_time';
示例:
mysql> show variables like 'long_query_time'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 2.000000 | +-----------------+----------+ 1 row in set, 1 warning (0.00 sec)
这里展示的是,超过2秒的查询,就是慢查询。如果值是0的话,表示所有查询都写入慢查询日志。
-
查看慢查询日志的路径
我们可以通过slow_query_log_file
变量查询日志的路径。show variables like 'slow_query_log_file';
示例:
mysql> show variables like 'slow_query_log_file'; +---------------------+-----------------------------+ | Variable_name | Value | +---------------------+-----------------------------+ | slow_query_log_file | ../logs/mysql_slowquery.log | +---------------------+-----------------------------+ 1 row in set, 1 warning (0.00 sec)
这里,显示路径是MySQL安装目录下面的
logs
目录内部(MySQL的运行目录是安装目录下的bin
目录)。
二、开启慢查询功能
- 开启慢查询日志
如果你的MySQL没有开启慢查询的话,可以使用下面的操作开启慢查询功能。
开启方法:
示例:set global slow_query_log = on;
mysql> set global slow_query_log = on; Query OK, 0 rows affected (0.00 sec)
- 设置慢查询的时间
示例:set global long_query_time=1;
mysql> set global long_query_time=1; Query OK, 0 rows affected (0.00 sec)
- 设置慢查询日志的路径
如果你有修改慢查询日志的需求,可以使用下面的命令set global slow_query_log_file='/home/mysql/sql_log/mysql-slow.log';
- 记录未使用索引的SQL
如果,想把查询中,没有使用索引的SQL语句,记录到慢查询日志里面,可以使用下面的命令开启。set global log_queries_not_using_indexes = on;
三、测试慢查询日志记录
慢查询功能开启之后,可以执行一个很耗时的sql
来测试。如果一时间,没有合适的sql
的来执行的话,可以执行MySQL的sleep
操作来模拟测试。
如果想要模拟一个4秒的慢查询,可以使用以下操作
select sleep(4);
实例如下:
mysql> select sleep(4);
+----------+
| sleep(4) |
+----------+
| 0 |
+----------+
1 row in set (4.00 sec)
此时,就可以去自己慢查询文件,看看记录的日志了。
四、慢查询日志分析
这是我的数据库内部的一个慢查询记录。
展示如下
(这是我做压力测试的时候的,产生的数据,由于压力测试前期的操作抢占了大量的资源,造成后面的数据添加等待时间过长,于是被记录到慢查询日志。本次执行的语句并没有问题。)
# Time: 2020-08-06T10:19:05.049526Z
# User@Host: root[root] @ localhost [::1] Id: 10799
# Query_time: 2.495331 Lock_time: 0.000216 Rows_sent: 0 Rows_examined: 0
SET timestamp=1596709142;
INSERT INTO t1 VALUES (NULL,18283,'2rcN83iyGgXMcql46x93aHooXcjSnQXHYjn8PSlyxjD1WoBA9YETLlnDtaYYW12HHWiO1W3HjJb9niqiI67q8BeDKjmiWYoELINnPILHAuyILNwnypv5bQ6ZKA8oYD') ;
Time 操作执行的时间节点。
User@Host 表示该操作的用户以及主机信息。
Query_time 该操作的执行时间。
Lock_time 该操作的锁定时间。
Rows_sent 该操作的发送的行。
Rows_examined 该操作的执行的行。
timestamp 时间戳的形式记录的执行时间。
SQL语句 执行的语句。
这里帮助发现你的SQL语句。你可以自行检查你的语句的设计是否合理,并尝试改进它。