线上 MySQL 突然变慢?慢查询日志堆了几十个 G?怎么定位、怎么分析、怎么治理?pt-query-digest 怎么用?加索引会不会锁表?一篇讲透慢查询全流程治理。
一、慢查询日志
1.1 开启与配置
-- 查看慢查询配置
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
-- 开启慢查询日志
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1; -- 超过 1s 的查询记录
SET GLOBAL log_queries_not_using_indexes = ON; -- 记录未用索引的查询
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL min_examined_row_limit = 100; -- 扫描行数 < 100 不记录
-- 持久化配置(my.cnf)
[mysqld]
slow_query_log = ON
long_query_time = 1
log_queries_not_using_indexes = ON
slow_query_log_file = /var/log/mysql/slow.log
min_examined_row_limit = 100
log_slow_admin_statements = ON -- 记录慢 DDL
log_slow_slave_statements = ON -- 记录从库慢查询
-- 慢查询日志格式
-- Time: 2024-06-01T10:23:45.123456Z
-- User@Host: app[app] @ [10.0.0.1] Id: 12345
-- Query_time: 2.345678 Lock_time: 0.000123 Rows_sent: 10 Rows_examined: 1000000
-- SET timestamp=1717235025;
-- SELECT * FROM orders WHERE user_id = 12345 ORDER BY create_time DESC;
2026/7/3大约 9 分钟