熟练使用慢查询日志、EXPLAIN、performance_schema 等工具
掌握分析 SQL 执行瓶颈的流程
学会识别并改写典型慢 SQL
MySQL 提供慢查询日志机制,记录执行时间超过阈值的 SQL 语句。
-- 开启慢查询日志
SET GLOBAL slow_query_log = 1;
-- 设置慢查询阈值(单位:秒)
SET GLOBAL long_query_time = 1;
-- 是否记录未使用索引的查询
SET GLOBAL log_queries_not_using_indexes = 1;
/var/lib/mysql/hostname-slow.log
线上分析第一步:先开启日志 → 再用工具分析
工具 | 用途 |
---|---|
mysqldumpslow | 官方工具,分析慢日志出现频次 |
pt-query-digest | 更强大的开源工具(推荐) |
performance_schema | 内部视图,可实时追踪 SQL 执行耗时 |
pt-query-digest /var/lib/mysql/mysql-slow.log
可输出:出现次数、平均执行时间、SQL 模板等
一条 SQL 的慢不仅可能是“索引没命中”,还有其他组件瓶颈。
解析时间(parse)
优化器选择执行计划时间
存储引擎取数据时间
网络传输时间
客户端处理慢(分页导致过多数据传输)
不能只看“SQL 写得对不对”,也要看上下文环境
SELECT * FROM orders WHERE customer_id = 1 ORDER BY create_time DESC LIMIT 100000, 10;
type = index
rows = 100000
Extra = Using filesort
原因:大 OFFSET 会扫描大量无效数据 + 排序成本高
SELECT * FROM orders
WHERE customer_id = 1 AND id > 上一页最大ID
ORDER BY id ASC LIMIT 10;
performance_schema
是 MySQL 内置的性能分析系统
-- 查看开启情况
SHOW VARIABLES LIKE 'performance_schema';
-- 查询 SQL 语句耗时统计
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY AVG_TIMER_WAIT DESC LIMIT 5;
可用于分析“哪类语句最慢”、“哪些语句最频繁”
-- 慢:不能用索引
SELECT * FROM user WHERE name LIKE '%张';
-- 优:使用倒排索引或全文索引
ALTER TABLE user ADD FULLTEXT(name);
SELECT * FROM user WHERE MATCH(name) AGAINST('张');
-- 慢:
SELECT * FROM t WHERE a = 1 OR b = 2;
-- 优:
SELECT * FROM t WHERE a = 1
UNION
SELECT * FROM t WHERE b = 2;
-- 慢:
SELECT * FROM t WHERE DATE(create_time) = '2024-01-01';
-- 优:
SELECT * FROM t WHERE create_time BETWEEN '2024-01-01 00:00:00'
AND '2024-01-01 23:59:59';
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 0;
-- 执行一个大分页慢 SQL
SELECT * FROM orders ORDER BY id LIMIT 100000, 10;
慢查询日志记录什么内容?如何查看?
使用 pt-query-digest 可以分析出哪些指标?
OFFSET 越大,SQL 越慢的本质原因是什么?
如何用 performance_schema 排查数据库热点 SQL?
[慢SQL] → 排查方向:
↳ 未命中索引? → EXPLAIN
↳ 扫描行太多? → rows 字段
↳ 排序文件大? → Using filesort
↳ 网络传输慢? → 客户端限制分页大小
↳ 后台阻塞严重? → SHOW PROCESSLIST
↳ SQL 太多? → performance_schema 分析 top SQL
不要盲目改 SQL,要“基于证据”定位问题!
下一章我们将进入 第8章:InnoDB 存储引擎架构深度解析,包括:
Buffer Pool 缓存机制
自适应哈希索引
页刷新与写入策略
InnoDB 的多线程架构设计