- 开启慢查询日志
SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 1; -- 超过 1s 记录 SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
- 用 mysqldumpslow 分析日志
# 按总耗时排序,取 Top 10 mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
- 使用 EXPLAIN 分析执行计划
EXPLAIN SELECT * FROM orders WHERE user_id=100 AND status='pending'; -- 重点关注:type(ALL=全表扫描), rows, key, Extra
- 查询 performance_schema 实时 Top SQL
SELECT digest_text, count_star, avg_timer_wait/1e12 AS avg_sec FROM performance_schema.events_statements_summary_by_digest ORDER BY avg_timer_wait DESC LIMIT 10;
优化方向
索引优化
为 WHERE/ORDER BY/GROUP BY 字段建立合适索引;删除冗余索引;使用联合索引覆盖查询字段。
-- 添加联合索引 ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
SQL 改写
避免 SELECT *;用 LIMIT 分页;避免函数作用于索引列;改写子查询为 JOIN。
-- 避免 WHERE YEAR(create_time) = 2025 -- 改为 WHERE create_time >= '2025-01-01' AND create_time < '2026-01-01'
分页优化
LIMIT 偏移量大时性能急剧下降,使用游标分页替代。
-- 慢(LIMIT 100000, 20) -- 改为游标分页 WHERE id > :last_id LIMIT 20
配置调优
适当增大 innodb_buffer_pool_size(建议物理内存 70%);启用 Query Cache(5.7)或升级 8.0 用连接池缓存。