-
Notifications
You must be signed in to change notification settings - Fork 111
slow_log
xiaoboluo768 edited this page Jun 7, 2020
·
2 revisions
- 该表提供查询执行时间超过long_query_time设置值的SQL,或者未使用索引的(需要开启参数log_queries_not_using_indexes=ON)或者管理语句(需要开启参数log_slow_admin_statements=ON)
- 表结构定义
CREATE TABLE `slow_log` (
`start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`user_host` mediumtext NOT NULL,
`query_time` time(6) NOT NULL,
`lock_time` time(6) NOT NULL,
`rows_sent` int(11) NOT NULL,
`rows_examined` int(11) NOT NULL,
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`sql_text` mediumblob NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';
- 表字段含义
- start_time:慢查询日志记录到表时的log_timestamps系统变量值
- user_host:带用户名和主机名(IP)格式的值,用于标记访问来源
- query_time:慢查询语句总的执行时间
- lock_time:慢查询语句持有锁的时间
- rows_sent:慢查询语句最终返回给客户端的数据记录数
- rows_examined:慢查询语句在存储引擎中的检查记录数
- db:慢查询语句执行时的默认库名
- last_insert_id:通常为0
- insert_id:通常为0
- server_id:产生慢查询语句的server id
- sql_text:慢查询日志的语句文本
- thread_id:产生慢查询日志的线程process_id
- 表记录内容示例
root@localhost : test 08:46:04> set global long_query_time=0;
Query OK, 0 rows affected (0.01 sec)
root@localhost : test 08:55:14> set global slow_query_log=1;
Query OK, 0 rows affected (0.01 sec)
# 断开会话重新连接
root@localhost : (none) 08:56:12> use test
Database changed
root@localhost : test 08:56:13> show tables;
+----------------+
| Tables_in_test |
+----------------+
| customer |
| product |
| shares |
| test |
| transreq |
+----------------+
5 rows in set (0.01 sec)
root@localhost : test 08:56:16> select * from test;
+---+---+------+------+------+------+
| a | b | c | d | e | f |
+---+---+------+------+------+------+
| 1 | 1 | 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 | 2 | 2 |
| 3 | 3 | 3 | 3 | 3 | 3 |
| 4 | 4 | 4 | 4 | 4 | 4 |
| 5 | 5 | 4 | 4 | 5 | 5 |
+---+---+------+------+------+------+
5 rows in set (0.01 sec)
root@localhost : test 08:56:18> 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 |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+----------------------------------+-----------+
| 2018-06-19 20:56:12.254716 | root[root] @ localhost [] | 00:00:00.000286 | 00:00:00.000000 | 1 | 0 | | 0 | 0 | 3306102 | select @@version_comment limit 1 | 4 |
| 2018-06-19 20:56:12.258551 | root[root] @ localhost [] | 00:00:00.000153 | 00:00:00.000000 | 1 | 0 | | 0 | 0 | 3306102 | select USER() | 4 |
| 2018-06-19 20:56:13.975382 | root[root] @ localhost [] | 00:00:00.000247 | 00:00:00.000000 | 1 | 0 | | 0 | 0 | 3306102 | SELECT DATABASE() | 4 |
| 2018-06-19 20:56:13.975627 | root[root] @ localhost [] | 00:00:00.000095 | 00:00:00.000000 | 1 | 0 | test | 0 | 0 | 3306102 | Init DB | 4 |
| 2018-06-19 20:56:16.277207 | root[root] @ localhost [] | 00:00:00.000490 | 00:00:00.000264 | 5 | 5 | test | 0 | 0 | 3306102 | show tables | 4 |
| 2018-06-19 20:56:18.936831 | root[root] @ localhost [] | 00:00:00.000694 | 00:00:00.000400 | 5 | 5 | test | 0 | 0 | 3306102 | select * from test | 4 |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+----------------------------------+-----------+
6 rows in set (0.00 sec)
- 慢查询日志包含了执行时间超过long_query_time系统变量设置的秒数的SQL语句,并且包含了需要检查行数超过min_examined_row_limit系统变量设置的值的SQL语句(默认情况下该变量为0,表示不限制检查行数)。long_query_time的最小值和默认值分别为0和10(单位秒)。该值可以指定为微秒(使用小数),但微秒单位只对记录到文件有效。对于记录到表中的慢查询语句,不支持微秒,微秒部分被忽略
- 默认情况下,慢查询日志不会记录管理语句,也不会记录未使用索引的语句,但可以使用log_slow_admin_statements和log_queries_not_using_indexes系统变量更改默认行为,使MySQL Server把管理语句和未使用索引的语句也一并计入慢查询日志。
- 慢查询日志中语句获取初始锁的时间不计入执行时间,包含时间范围为:获取锁之后,并在语句执行完成之后,将锁释放之前。然后将慢查询语句写入慢查询日志中。所以,在慢查询日志中记录的顺序可能与MySQL Server接收到的语句顺序(执行顺序)并不相同,因为可能有的先执行的语句最后才释放完所有的锁,有的后执行的语句先释放完所有的锁
- 默认情况下,慢查询日志不启用。要启用可以使用--slow_query_log =1进行设置,要指定慢查询日志文件名称,可以使用--slow_query_log_file = file_name进行设置,要指定慢查询日志输出目标,可以使用--log-output=FILE|TABLE|NONE 进行设置
- 如果启用了慢查询日志记录功能,但是未指定名称,则默认在datadir下命名为host_name-slow.log,如果使用--log-output=TABLE 设置了报错在表中,则slow_query_log_file = file_name 设置的路径无效
- 要动态修改慢查询日志文件名称,可以使用slow_query_log=0先关闭慢查询日志文件,然后使用slow_query_log_file=new_file_name指定新的慢查询日志文件名,然后使用slow_query_log=1重新启用慢查询日志日志文件
- 如果mysqld在启动是使用了--log-short-format选项,则MySQL Server会将较少的慢查询信息写入慢速查询日志中
- 如果使用了log_slow_admin_statements=1 设置,则MySQL Server会在慢查询日志中记录如下管理语句:
- ALTER TABLE,ANALYZE TABLE,CHECK TABLE,CREATE INDEX,DROP INDEX,OPTIMIZE TABLE和REPAIR TABLE
- 如果使用了log_queries_not_using_indexes=1 设置,则MySQL Server会把任何不使用索引的查询语句记录到慢查询日志中
- 当记录这些查询语句时,慢查询日志可能会迅速增长。此时可以通过设置log_throttle_queries_not_using_indexes系统变量来限制这些未使用索引的语句计入慢查询日志的速率(注意:该变量限制的是60秒内的未使用索引的语句数量,不是限制时间)。默认情况下,这个变量是0,表示没有速率限制。当启用限制时,第一个不使用索引的查询执行之后,将打开一个60秒的时间窗口,在该窗口内,将禁止其他未使用索引的查询记录到慢查询日志中,等待时间窗口结束之后,Server记录一个摘要信息,表示有多少次以及在这些执行次数总的花费时间。然后进入下一个60秒的窗口
- MySQL Server按照以下顺序来判断语句是否需要计入慢查询:
- 判断参数 log_slow_admin_statements是否启用,如果启用,则判断语句是否是管理语句,如果是 则计入慢查询,不是则进入下一轮判断。如果参数未启用,则进入下一步判断
- 判断查询语句执行时间是否超过long_query_time秒,如果超过则计入慢查询,如果未超过,则判断log_queries_not_using_indexes 参数是否启用,如果启用该参数且该语句未使用索引,则计入慢查询,否则进入下一步判断
- 如果min_examined_row_limit变量设置非零值,则判断语句的检查行数是否超过该变量设置的值,如果超过则计入慢查询,如果未超过则不记录慢查询
- 慢查询日志记录的时间戳由log_timestamps系统变量控制
- 默认情况下,复制架构中的从库不会将重放binlog产生的慢查询写入自己的慢查询日志中,如果需要记录从库重放binlog的慢查询语句计入慢查询日志,需要启用变量log_slow_slave_statements=1
- 写入慢查询日志的语句中的密码被服务器重写,不会以纯文本形式出现。如果需要记录原始语句,需要使用--log-raw选项
上一篇:general_log表 |下一篇:帮助信息表
- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!