一、为什么你的SQL跑得慢?
遇到数据库卡顿,十有八九是查询语句出了问题。想象一下你让MySQL去仓库搬货,它却不知道最短路径在哪——EXPLAIN就是那张路线图。输入EXPLAIN SELECT...就能看到MySQL的执行计划。比如下面这个简单例子:

EXPLAIN SELECT * FROM users WHERE age > 25;
结果会返回十几列关键信息,就像汽车的仪表盘显示转速、油耗一样,告诉你数据库引擎怎么处理这条命令。
二、执行计划字段全解析
拿到EXPLAIN结果别发懵,重点盯紧这几个核心指标:
- type列:好比交通方式,
ALL代表全表扫描(走路),index是索引扫描(骑车),ref则是精准定位(开车) - key列:显示实际使用的索引,如果这里写着
NULL,说明没踩上索引的油门 - rows列:预估扫描行数,超过1000行就要警惕了
- Extra列:暗藏玄机,
Using filesort出现代表排序性能爆炸
三、索引使用情况诊断
索引就像图书馆目录,用对了查书秒达,用错了满馆乱翻。通过possible_keys和key的对比,立刻发现索引失效:
| 场景 | possible_keys | key | 问题 |
|---|---|---|---|
| 理想情况 | index_age | index_age | 索引有效 |
| 异常情况 | index_age,index_name | NULL | 索引未启用 |
曾有个电商项目,某页面加载要8秒,EXPLAIN显示type=ALL且rows=500000——原来漏了订单表的日期索引。
四、揪出隐藏的性能杀手
Extra列里的警告信息最容易被忽略,却是性能调优的金矿:
- Using temporary:MySQL被迫创建临时表,常见于GROUP BY和DISTINCT操作
- Using filesort:文件排序消耗CPU,好比让仓库管理员手动整理包裹
- Range checked for each record:索引选择困难症,每行都要重新选路径
解决之道往往是调整索引顺序或重写查询。比如把SELECT * FROM logs WHERE create_time > '2023-01-01' ORDER BY user_id改成联合索引(user_id, create_time),能同时消灭排序和过滤的瓶颈。
五、复杂查询的进阶分析法
面对多表关联查询,试试EXPLAIN FORMAT=JSON,输出结果像树状图一样清晰:
EXPLAIN FORMAT=JSON
SELECT * FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.city=’杭州’;
JSON格式会暴露嵌套循环的细节,比如驱动表选择是否合理。曾经优化过的一个三表联查,通过JSON输出发现第二个JOIN扫描了20万行,调整索引后降到200行。
六、分区表特别注意事项
当表被分区时,partitions字段会显示命中的分区。某物流系统按月份分区,原本查询:
SELECT * FROM shipments WHERE create_date BETWEEN ‘2025-01-01’ AND ‘2025-12-31’
EXPLAIN显示扫描了全部分区,优化成WHERE create_date IN ('2025-01','2025-02'...)后,partitions列精准锁定12个分区,查询速度提升6倍。
七、避免EXPLAIN的常见误区
新手最容易踩的坑:
- 只看不执行:EXPLAIN只是预测,实际执行可能因数据分布变化
- 忽视数据量:测试时用10条数据EXPLAIN很美,上线后百万数据原形毕露
- 过度优化:为了所有指标绿色疯狂建索引,反而降低写入速度
建议在预发布环境用真实数据跑EXPLAIN ANALYZE(MySQL8.0+),它会真实执行查询并返回实际耗时。
八、实战优化案例:5秒到0.1秒的蜕变
某用户管理界面搜索慢如蜗牛,原始查询:
SELECT name,phone FROM users
WHERE status=1 AND department_id IN (1,5,7)
ORDER BY create_time DESC LIMIT 20
EXPLINE结果:
- type: index(全索引扫描)
- key: idx_status
- rows: 18万
- Extra: Using where; Using filesort
优化步骤:
- 创建联合索引
(status, department_id, create_time) - 改写查询为
WHERE status=1 AND department_id=1 ... UNION
最终EXPLAIN显示type=range且rows=120,Extra列filesort消失,页面加载从5秒降到0.1秒。
内容均以整理官方公开资料,价格可能随活动调整,请以购买页面显示为准,如涉侵权,请联系客服处理。
本文由星速云发布。发布者:星速云。禁止采集与转载行为,违者必究。出处:https://www.67wa.com/150181.html