Skip to content

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表 |下一篇:帮助信息表

Clone this wiki locally