2
头图

MySQL 慢查询日志 (Slow Query Log) 详解

一、慢查询日志概述

慢查询日志是MySQL提供的用于记录执行时间超过指定阈值的SQL语句的日志功能,是数据库性能优化的核心工具之一。
大白话就是,查询语句超过一定时间没有结果返回,就会将查询语句记录到日志中。

二、核心作用与功能

  1. 性能问题定位:识别执行效率低下的SQL语句
  2. SQL优化依据:提供真实的SQL执行性能数据
  3. 系统监控:监控数据库长期性能变化趋势
  4. 索引优化:发现缺失或无效的索引使用情况

三、工作机制

  1. 记录时机:SQL执行完成后记录(与general log不同)
  2. 记录内容

    • 执行时间超过阈值的SQL
    • 执行参数(时间、锁时间、返回行数等)
    • 用户和连接信息
  3. 触发条件:满足以下任一条件

    • 执行时间 > long_query_time
    • 未使用索引且min_examined_row_limit达到阈值
    • 管理语句慢查询(需单独开启)

四、配置方式

1. 配置文件设置(永久生效)

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
min_examined_row_limit = 100
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_output = FILE

2. 动态设置(无需重启)

-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';

-- 设置慢查询阈值(秒)
SET GLOBAL long_query_time = 0.5;

-- 记录未使用索引的查询
SET GLOBAL log_queries_not_using_indexes = 'ON';

-- 关闭慢查询日志
SET GLOBAL slow_query_log = 'OFF';

五、核心参数详解

参数名类型默认值说明
slow_query_logBooleanOFF慢查询日志总开关
slow_query_log_fileStringhostname-slow.log慢查询日志文件路径
long_query_timeFloat10慢查询阈值(秒)
log_queries_not_using_indexesBooleanOFF是否记录未使用索引的查询
min_examined_row_limitInteger0记录检查行数超过该值的查询
log_slow_admin_statementsBooleanOFF是否记录慢管理语句(如ALTER/ANALYZE等)
log_slow_slave_statementsBooleanOFF是否记录从库慢查询
log_outputEnumFILE输出目标(FILE/TABLE/NONE)
log_throttle_queries_not_using_indexesInteger0每分钟允许记录到slow log的且未使用索引的SQL语句次数

补充说明:

1、单位

long_query_time 以秒为单位,支持小数(如 0.5 表示500毫秒)
min_examined_row_limit 以行为单位

2、常用配置示例:

-- 开启慢查询日志
SET GLOBAL slow_query_log = ON;

-- 设置慢查询阈值为1秒
SET GLOBAL long_query_time = 1;

-- 记录未使用索引的查询
SET GLOBAL log_queries_not_using_indexes = ON;

3、输出目标

FILE: 输出到日志文件(默认)
TABLE: 输出到 mysql.slow_log 表
NONE: 关闭输出

4、8.0.14版本引入的参数log_slow_extra

用于控制是否在慢查询日志中记录额外的执行统计信息
参数类型为布尔型
默认值是 OFF

功能作用:
当启用时,慢查询日志会额外记录以下重要信息:

  • 查询使用的线程ID
  • 查询检查的行数(rows_examined)
  • 查询返回的行数(rows_sent)
  • 查询读取的行数(rows_affected)
  • 查询执行的用户
  • 查询的hostname
  • 查询的应用程序名称(如果通过客户端指定)

六、优缺点分析

优点:

  1. 精准定位:准确识别性能瓶颈SQL
  2. 执行详情:记录执行时间、锁时间等关键指标
  3. 灵活配置:可调整阈值和记录条件
  4. 优化依据:提供真实的SQL执行数据

缺点:

  1. 性能开销:记录日志有约3-5%性能损耗
  2. 日志管理:需要定期清理和轮转
  3. 分析门槛:需要专业知识解读日志
  4. 阈值局限:可能遗漏短时高频问题SQL

七、慢查询日志分析

1. 日志格式示例

# Time: 2023-08-20T14:23:45.123456Z
# User@Host: root[root] @ localhost [] Id: 123
# Query_time: 2.345678 Lock_time: 0.000123 Rows_sent: 1 Rows_examined: 100000
SET timestamp=1234567890;
SELECT * FROM large_table WHERE unindexed_column = 'value';

2. 关键字段说明

  • Query_time:SQL执行总时间(秒)
  • Lock_time:等待锁的时间(秒)
  • Rows_sent:返回给客户端的行数
  • Rows_examined:服务器检查的行数

八、分析工具推荐

1. mysqldumpslow(官方工具)

# 统计最慢的10个查询
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log

# 统计出现次数最多的慢查询
mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log

2. pt-query-digest(Percona Toolkit)

# 生成完整分析报告
pt-query-digest /var/log/mysql/mysql-slow.log > slow_report.txt

# 分析特定时间段的日志
pt-query-digest --since '2023-08-20 00:00:00' /var/log/mysql/mysql-slow.log

3. 可视化工具

  • Percona PMM:企业级监控方案
  • VividCortex:SaaS性能分析平台
  • MySQL Enterprise Monitor:官方监控工具

九、慢查询优化

EXPLAIN分析:对慢SQL执行EXPLAIN查看执行计划

EXPLAIN SELECT * FROM large_table WHERE unindexed_column = 'value';

索引优化:

  • 为WHERE条件列添加索引
  • 优化复合索引顺序
  • 避免索引失效场景

SQL重写:

  • 简化复杂查询
  • 避免SELECT *
  • 优化JOIN操作

架构优化:

  • 考虑读写分离
  • 引入缓存层
  • 数据分片

十、生产环境建议

1、阈值设置: 初始建议0.5-1秒,根据业务调整
2、日志轮转: 配置logrotate防止磁盘占满
3、定期分析: 建议每周分析慢查询趋势
4、安全注意: 日志可能包含敏感信息,需设置适当权限

晚上不吃饭
12 声望2 粉丝