1、MySQL慢查询的配置属性
A.查看慢查询的开启状态及慢查询的日志存储目录
show variables like '%slow_query%';
慢查询日志的存储未指定文件名会默认生成”主机名-slow.log”的文件。
B.查询慢查询的日志记录时间
show variables like 'long_query_time';
2、慢查询日志的开启
A.通过全局命令开启
mysql> set global slow_query_log='ON';
mysql> set global slow_query_log_file='/usr/local/mysql/data/slow.log';
mysql> set global long_query_time=1;
B.通过配置文件配置并重启MySQL服务
①.修改配置my.cnf或者my.ini文件并保存
在配置文件的[mysqld]下面添加一行内容 slow_query_log=1 即可开启慢查询,其他配置内容如下
[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1
②.重启MySQL服务
Microsoft Windows [版本 10.0.18363.900]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\WINDOWS\system32>net stop mysql
MySQL 服务正在停止.
MySQL 服务已成功停止。
C:\WINDOWS\system32>net start mysql
MySQL 服务正在启动 ..
MySQL 服务已经启动成功。
③.打开MySQL客户端通过 show variables like '%slow_query%';
查询慢查询开启状态
3、测试慢查询的日志记录
mysql> select sleep(2);
+----------+
| sleep(2) |
+----------+
| 0 |
+----------+
1 row in set (2.01 sec)
mysql> select sleep(11);
+-----------+
| sleep(11) |
+-----------+
| 0 |
+-----------+
1 row in set (11.00 sec)
mysql>
4、记录慢查询日志到数据库表
A.在配置文件添加如下命令行
mysql库下面有一个默认的slow_log表,可以直接将slow_query_log_file = slow_log
,即可将慢查询日志记录到表中。
##配置慢查询
slow_query_log=1
log_output = table
B.重启MySQL服务
Microsoft Windows [版本 10.0.18363.900]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\WINDOWS\system32>net stop mysql
MySQL 服务正在停止..
MySQL 服务已成功停止。
C:\WINDOWS\system32>net start mysql
MySQL 服务正在启动 ..
MySQL 服务已经启动成功。
C:\WINDOWS\system32>
C.通过命令查看慢查询日志输出到表是否成功
mysql> show variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | TABLE |
+---------------+-------+
1 row in set, 1 warning (0.01 sec)
mysql>
D.在MySQL表中查看慢查询的日志记录
mysql> select * from mysql.slow_log;
+----------------------------+------------------------------+-----------------+-----------------+-----------+---------------+----+----------------+-----------+-----------+------------------+-----------+
| start_time | user_host | query_time | lock_time | rows_sent | rows_examined | db | last_insert_id | insert_id | server_id | sql_text | thread_id |
+----------------------------+------------------------------+-----------------+-----------------+-----------+---------------+----+----------------+-----------+-----------+------------------+-----------+
| 2020-07-10 23:43:40.290020 | root[root] @ localhost [::1] | 00:00:11.000904 | 00:00:00.000000 | 1 | 0 | | 0 | 0 | 1 | select sleep(11) | 8 |
| 2020-07-10 23:44:10.887578 | root[root] @ localhost [::1] | 00:00:11.000009 | 00:00:00.000000 | 1 | 0 | | 0 | 0 | 1 | select sleep(11) | 8 |
+----------------------------+------------------------------+-----------------+-----------------+-----------+---------------+----+----------------+-----------+-----------+------------------+-----------+
2 rows in set (0.00 sec)
mysql>
如果查询出的sql_text列中为二进制文本需要通过convert函数进行转换
select convert(sql_text using utf8) sql_text from mysql.slow_log;
再查看慢查询日志记录文件中未持续更新保存,所有新记录全在MySQL表中
5、MySQL慢查询记录到日志文件和表中的区别
- 慢查询记录到日志文件和表中,记录本身差别不大,如果是记录在表中,慢查询的执行时间信息无法精确到微妙,
- 如果将慢查询信息记录在表中,方便查询,但因为是结构化的数据,可能会比记录在慢查询日志文件中(平面文本文件)要慢一点,如果是记录到文件,需要mysqldumpslow工具解析。
- 慢查询不记录执行失败的查询,比如long_query_time设置为10(10秒钟),一个查询超过了10秒钟,但是因为其他原因执行失败,MySQL的慢查询将无法记录此查询信息。