慢查询日志可用于查找执行时间较长的查询,因此可以作为优化的候选对象。但是,检查较长的慢查询日志可能是一项耗时的任务。
系统变量
输出目标
- log_output
- 控制常规日志和慢查询日志的输出目标,可以是文件或表
慢查询日志的属性
- slow_query_log
- 控制慢查询日志的开启/禁用
- 开启慢查询日志后,还需要指定日志的输出目标
- slow_query_log_file=file_name
- 慢查询日志的文件名。默认文件名
host_name-slow.log
- 慢查询日志的文件名。默认文件名
阈值
- long_query_time
- 执行时间阈值,最小为0,默认10秒,可以指定为微秒
- 获取初始锁的时间不算做执行时间。mysqld 在执行并释放所有锁后,才会记录慢日志,因此慢日志顺序与执行顺序不同
- min_examined_row_limit
- 检查的最少行数
记录内容
- log_slow_admin_statements
- 记录管理语句。默认不记录
管理语句包括:
CREATE INDEX DROP INDEX ALTER TABLE ANALYZE TABLE CHECK TABLE OPTIMIZE TABLE REPAIR TABLE
- 记录管理语句。默认不记录
- log_queries_not_using_indexes
- 记录不走索引的语句。默认不记录。
- 表记录少于两行的除外,因为无法从索引中受益。
- 开启后日志会增长很快。
- log_throttle_queries_not_using_indexes
- 不走索引的查询的速率限制
- 有效值
- 0:(默认) 无限制
- 正数:表示每分钟记录多少个
格式
- log_timestamps
- 控制日志中时间戳的时区格式
-
慢日志中的时间戳表示慢语句开始执行的时间
8.0.14 版本之前,时间戳记录的是语句执行之后的时间。
-
log-short-format
- 记录较少信息,简要记录
- log_slow_extra
- 控制日志中是否产生额外字段
主从复制
- log_slow_slave_statements
- 从节点把复制的语句记录到慢日志。默认不记录。
- 基于行模式下,此变量无效
分析日志内容
可以使用 MySQL 工具 mysqldumpslow,也可以使用第三方工具,如 percona-toolkit、Anemometer。
mysqldumpslow
[root@yingzai ~]$ mysqldumpslow slow.log
Reading mysql slow query log from slow.log
Count: 14 Time=0.03s (0s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
insert into t2 select id from t2
Count: 1 Time=0.01s (0s) Lock=0.00s (0s) Rows=1.0 (1), root[root]@localhost
select * from t2
Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=10.0 (10), root[root]@localhost
select * from t2 limit N
- -s c:按查询次数排序
- -t 10:显示前10个查询
percona-toolkit
- 略
Anemometer
- 略
日志输出
如果日志输出目标是 FILE,则慢日志中的每个语句均以 #
字符开头。
基础字段
- Query_time: duration
- 语句执行时间,以秒为单位
- Lock_time: duration
- 获取锁的时间,以秒为单位
- Rows_sent: N
- 发送给客户端的行数
- Rows_examined:
- 服务器层检查的行数 (不计算存储引擎内部的任何处理)
额外字段
启用系统变量 log_slow_extra 之后,会有一些额外字段产生。
- Thread_id: ID
- 语句线程标识符
- Errno: error_number
- 语句的错误号码,如未报错,则返回0
- Killed: N
- 如果该语句终止,则错误号指示原因,如果该语句正常终止,则返回0
- Bytes_received: N
- Bytes_received 语句的值
- Bytes_sent: N
- Bytes_sent 语句的值
- Read_first: N
- Handler_read_first 语句的值
- Read_last: N
- Handler_read_last 语句的值
- Read_key: N
- Handler_read_key 语句的值
- Read_next: N
- Handler_read_next 语句的值
- Read_prev: N
- Handler_read_prev 语句的值
- Read_rnd: N
- Handler_read_rnd 语句的值
- Read_rnd_next: N
- Handler_read_rnd_next 语句的值
- Sort_merge_passes: N
- Sort_merge_passes 语句的值
- Sort_range_count: N
- Sort_range 语句的值
- Sort_rows: N
- Sort_rows 语句的值
- Sort_scan_count: N
- Sort_scan 语句的值
- Created_tmp_disk_tables: N
- Created_tmp_disk_tables 语句的值
- Created_tmp_tables: N
- Created_tmp_tables 语句的值
- Start: timestamp
- 语句执行的开始时间
- End: timestamp
- 语句执行的结束时间