MySQL 慢查询日志 (Slow Query Log) 详解
一、慢查询日志概述
慢查询日志是MySQL提供的用于记录执行时间超过指定阈值的SQL语句的日志功能,是数据库性能优化的核心工具之一。
大白话就是,查询语句超过一定时间没有结果返回,就会将查询语句记录到日志中。
二、核心作用与功能
- 性能问题定位:识别执行效率低下的SQL语句
- SQL优化依据:提供真实的SQL执行性能数据
- 系统监控:监控数据库长期性能变化趋势
- 索引优化:发现缺失或无效的索引使用情况
三、工作机制
- 记录时机:SQL执行完成后记录(与general log不同)
记录内容:
- 执行时间超过阈值的SQL
- 执行参数(时间、锁时间、返回行数等)
- 用户和连接信息
触发条件:满足以下任一条件
- 执行时间 > 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_log | Boolean | OFF | 慢查询日志总开关 |
slow_query_log_file | String | hostname-slow.log | 慢查询日志文件路径 |
long_query_time | Float | 10 | 慢查询阈值(秒) |
log_queries_not_using_indexes | Boolean | OFF | 是否记录未使用索引的查询 |
min_examined_row_limit | Integer | 0 | 记录检查行数超过该值的查询 |
log_slow_admin_statements | Boolean | OFF | 是否记录慢管理语句(如ALTER/ANALYZE等) |
log_slow_slave_statements | Boolean | OFF | 是否记录从库慢查询 |
log_output | Enum | FILE | 输出目标(FILE/TABLE/NONE) |
log_throttle_queries_not_using_indexes | Integer | 0 | 每分钟允许记录到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
- 查询的应用程序名称(如果通过客户端指定)
六、优缺点分析
优点:
- 精准定位:准确识别性能瓶颈SQL
- 执行详情:记录执行时间、锁时间等关键指标
- 灵活配置:可调整阈值和记录条件
- 优化依据:提供真实的SQL执行数据
缺点:
- 性能开销:记录日志有约3-5%性能损耗
- 日志管理:需要定期清理和轮转
- 分析门槛:需要专业知识解读日志
- 阈值局限:可能遗漏短时高频问题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、安全注意: 日志可能包含敏感信息,需设置适当权限
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。