慢查询日志

慢查询日志

慢查询日志可用于查找执行时间较长的查询,因此可以作为优化的候选对象。但是,检查较长的慢查询日志可能是一项耗时的任务。

系统变量

输出目标

  • 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
    • 语句执行的结束时间

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注