MySQL 慢查询优化:从 EXPLAIN 到性能调优
慢查询是 MySQL 性能问题的主要原因。本文介绍慢查询的排查和优化方法。
开启慢查询日志
-- 查看配置
SHOW VARIABLES LIKE 'slow_query%';
-- 开启慢查询
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1; -- 超过1秒记录
SET GLOBAL log_queries_not_using_indexes = ON;
EXPLAIN 分析
EXPLAIN SELECT * FROM users WHERE name = '张三';
type 字段
| type | 说明 | 性能 |
|---|---|---|
| system | 系统表 | 最好 |
| const | 主键/唯一索引等值查询 | 好 |
| ref | 非唯一索引等值查询 | 好 |
| range | 索引范围查询 | 中 |
| index | 全索引扫描 | 差 |
| ALL | 全表扫描 | 最差 |
Extra 字段
| Extra | 说明 |
|---|---|
| Using index | 覆盖索引 |
| Using where | 服务器层过滤 |
| Using temporary | 使用临时表 |
| Using filesort | 额外排序 |
常见慢查询优化
1. 全表扫描
-- ❌ 全表扫描
SELECT * FROM users WHERE age > 20;
-- ✅ 添加索引
CREATE INDEX idx_age ON users(age);
2. 索引失效
-- ❌ 函数操作
SELECT * FROM users WHERE YEAR(create_time) = 2024;
-- ✅ 范围查询
SELECT * FROM users WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01';
3. 分页优化
-- ❌ 深分页
SELECT * FROM users ORDER BY id LIMIT 1000000, 10;
-- ✅ 使用游标
SELECT * FROM users WHERE id > 1000000 ORDER BY id LIMIT 10;
4. JOIN 优化
-- 确保关联字段有索引
CREATE INDEX idx_user_id ON orders(user_id);
-- 小表驱动大表
SELECT * FROM small_table s JOIN big_table b ON s.id = b.sid;
总结
慢查询优化的核心是 EXPLAIN 分析。通过添加索引、优化 SQL、避免索引失效,可以大幅提升查询性能。