用 EXPLAIN 看懂一次慢查询
- MySQL 数据库
- 时间:2026-05-18 17:30:00
- 306 人已阅读
简介EXPLAIN 不只是看有没有用索引,还要关注 type、rows、Extra 等字段背后的含义。 本文会结合项目实践,重点记录type 从 ALL 到 range/ref/const 逐渐更理想、rows 过大时要重新审视筛选条件等处理思路,方便后续开发和排错时复用。
用 EXPLAIN 看懂一次慢查询
EXPLAIN 不只是看有没有用索引,还要关注 type、rows、Extra 等字段背后的含义。 本文会结合项目实践,重点记录type 从 ALL 到 range/ref/const 逐渐更理想、rows 过大时要重新审视筛选条件等处理思路,方便后续开发和排错时复用。

背景
这篇笔记来自个人博客项目里一次比较完整的实践。最初看起来只是一个小功能,但真正落到页面、后台、数据库和移动端之后,就会发现它牵涉到数据结构、交互反馈、权限边界和后续维护。
我的处理原则是:先让功能能被稳定使用,再把容易出错的地方收拢成约束。这样做不会让第一版变得很重,但能避免后面每加一个页面都重新踩一遍同样的问题。
实践要点
- type 从 ALL 到 range/ref/const 逐渐更理想。
- rows 过大时要重新审视筛选条件。
- Using filesort 不一定错误,但需要结合数据量判断。
落地步骤
- 先确认页面真实使用场景,区分前台访客操作和后台管理员操作。
- 再整理数据来源,明确哪些字段来自数据库,哪些只是展示层计算结果。
- 然后补齐表单校验、空数据状态、错误提示和移动端样式。
- 最后用几条真实数据走一遍流程,检查列表、详情、分页和保存后的跳转。
在这个过程中,最容易被忽略的是“看起来能用”和“长期好用”之间的差距。比如提示信息是否统一、按钮是否会重复提交、列表是否分页、上传文件是否能被安全删除,这些细节都会影响后续维护体验。
示例代码
EXPLAIN SELECT * FROM articles WHERE status = 1 ORDER BY published_at DESC LIMIT 10;
排查清单
- 如果页面显示异常,先看浏览器控制台和服务端日志,不要只盯着模板。
- 如果数据没有生效,确认查询条件、发布状态、软删除字段和缓存。
- 如果前台和预览不一致,优先检查 Markdown 渲染规则和公共 CSS。
- 如果手机端布局溢出,先判断是表格需要横向滚动,还是表单本身应该自适应。
个人记录
这类功能真正有价值的地方,不只是把按钮做出来,而是把规则说清楚。比如“type 从 ALL 到 range/ref/const 逐渐更理想。”这类经验,如果不写下来,下一次遇到相似问题还是会凭感觉处理。
另一个收获是:rows 过大时要重新审视筛选条件。 这会让项目越做越稳。早期多花一点时间整理边界,后面扩展分类、标签、留言、媒体库或者轮播配置时,心里会踏实很多。
Using filesort 不一定错误,但需要结合数据量判断。
小结
这篇笔记更像一次项目复盘:把问题拆清楚,把约束写明确,再把可以复用的处理方式沉淀下来。个人博客虽然规模不大,但它包含内容管理系统里常见的很多环节,认真做一遍,会比只看文档记得更牢。
上一篇:给个人博客补 RSS 输出的思路
文章评论
暂无评论,来写第一条吧。