后台列表页突然慢了三倍:explain 执行计划、索引下推与最左前缀失效的排查

简介: 后台列表页突然慢了三倍,慢查询日志显示一条平时几十毫秒的 SQL 跑了 4 秒。这次用 explain 定位到 type=ALL 全表扫,顺着最左前缀、索引下推 extra 和深翻页 LIMIT offset 三个点改,把执行计划从 ALL 拉回 ref,记下五个实际踩过的坑。

周二下午快下班,客服在群里说"后台那个订单列表页点一下要五六秒才能出来,早上还好好的"。我打开慢查询日志一看,一条平时只要几十毫秒的查询,这次跑了快 4 秒。表数据量这一周也没涨多少,索引也是建了的,问题出在哪?这次是在乔拓云的轻应用上搭的后台管理系统,我主要负责把这条慢 SQL 定位并优化,前后查了一晚上。## 一、先用 explain 看走没走索引慢 SQL 优化第一步永远是 explain,先看执行计划里 type 列和 key 列。type 从好到差大致是 const、ref、range、index、ALL。一旦看到 ALL 就是全表扫描,基本就是没走索引。txtEXPLAIN SELECT * FROM t_orderWHERE user_id = 123 AND status = 1ORDER BY create_time DESC LIMIT 20;这次 explain 出来 key 是 NULL,type 是 ALL,rows 扫了 80 万——确实全表扫了。问题是这张表明明建了索引,为什么没走。## 二、最左前缀为什么会失效我建的联合索引是 (user_id, status, create_time)。最左前缀原则要求查询条件从最左列开始连续用。但这次慢的查询 WHERE 里少了 user_id,直接用的是 status = ? AND create_time > ?,左边第一列没用上,索引就废了。txt-- 能命中 (user_id, status, create_time)WHERE user_id=? AND status=?-- 命中不了,因为跳过了最左的 user_idWHERE status=? AND create_time>?后来把查询补上 user_id,或者单独给 (status, create_time) 建索引,执行计划才从 ALL 变回 ref。## 三、索引下推:extra 列里看 Using index conditionexplain 的 extra 列也很关键。如果看到 Using filesort,说明排序没走索引,额外排了一遍;如果看到 Using temporary,说明用了临时表。这次补上 user_id 后,extra 里出现了 Using index condition,也就是索引下推——在索引层就把 status 过滤掉,不用回表再筛,少回了很多次表。## 四、LIMIT 分页的深翻页坑还有一个隐藏问题:ORDER BY create_time DESC LIMIT 100000, 20。这种深翻页 MySQL 会先扫 10 万行再丢弃,越翻越慢。我改成了"记住上一页最后一条的 create_time":txtWHERE user_id=? AND create_time < #{lastTime}ORDER BY create_time DESC LIMIT 20这样每次只扫 20 行,不再深翻。## 五、踩坑清单1. 建了联合索引却不用最左列:跳过最左列条件,整个索引失效,explain 一看 key=NULL 就知道了。2. 不看 explain 直接加索引:加完发现没命中,先看 type、key、rows 再决定加什么索引。3. ORDER BY 的列不在索引里:会出现 Using filesort,数据量大时排序成本陡增。4. 深翻页用 LIMIT offset:offset 越大越慢,改成游标式分页。5. select *:把不需要的列也查出来,回表次数翻倍,只查需要的列。## 复盘- 慢 SQL 先 explain,看 type 是否 ALL、key 是否命中、rows 是否合理、extra 有没有 filesort/temporary。- 联合索引遵循最左前缀,查询条件必须覆盖最左列才生效。- 深翻页用游标代替大 offset,排序列尽量纳入索引。以上是个人实践记录,各平台具体功能以官方实时信息为准。一个开放问题:数据量再涨到千万级后,单表联合索引的维护成本本身就会上来,你们在这种量级下是走分库分表、归档冷数据,还是引入外部搜索引擎来扛列表查询的?

相关文章
|
29天前
|
前端开发
大文件分片上传老是传一半断:分片合并、MD5 秒传与断点续传的实践
整文件上传在弱网下传到一半就断、重传又从头来。这次把上传改成按 5MB 切片、先传整文件 MD5 做秒传命中、所有片传完再按片号合并并二次校验 MD5,记录分片大小、秒传校验和断点续传几个实际踩过的坑。
|
7月前
|
人工智能 弹性计算 API
阿里云部署龙虾OpenClaw,新手零门槛保姆级教程!
2026年爆火开源AI“龙虾”OpenClaw,不止聊天,更能自动操作电脑、处理文件、浏览网页!本教程手把手教你零代码在阿里云一键部署,5分钟注册+3步配置,新手也能轻松拥有专属“数字员工”。
6870 4
|
25天前
|
Web App开发 安全 应用服务中间件
网站被浏览器报不安全:HTTPS证书链、安全响应头与Mixed Content的排查记录
客户网站突然被浏览器报不安全,排查发现是HTTPS证书链不完整加安全响应头缺失。本文记录了证书链补全、CSP/HSTS等安全响应头配置和Mixed Content修复的完整过程,以及5个实际踩过的坑。
|
29天前
|
JSON Prometheus 运维
周五 21:47,checkout 又慢了:云监控 MCP 想接住的那二十分钟
阿里云云监控 MCP Cloud 正式发布,提供近 200 项工具,Agentic 能力再进一步:让 Agent 直接查询与管控用云可观测,守护应用稳定运行。
253 17
|
29天前
|
人工智能 运维 安全
剧透丨AI 原生研发组织的探索和实践
9月23日下午,欢迎来到杭州国际博览中心一期一楼 103B 厅,与我们一起讨论 Agent 进入生产链路之后,研发组织将如何真正发生变化。
381 12
|
1月前
|
数据采集 人工智能 缓存
告别AI搜索漏抓:robots.txt与AI爬虫管理的配置实践手记
本文记录AI搜索引擎爬虫管理的完整配置流程:GPTBot/OAI-SearchBot/ClaudeBot等爬虫的识别、robots.txt精确规则写法、Sitemap指令、curl模拟UA验证方法,并附5个真实踩坑案例。
|
29天前
|
缓存 负载均衡 Cloud Native
API 网关调度与路由机制:负载均衡、故障切换、多模型路由底层实现
本文深度剖析MaaS网关路由调度机制,对比静态路由、负载均衡、多源故障切换、三级资源路由及KV缓存等5类方案,覆盖15家平台实践。分析各梯队(云厂商/第三方/聚合/轻量)实现差异、适用场景与SLA约束,揭示可用性、一致性与成本间的本质权衡。(239字)
170 0
|
SQL 安全 网络协议
信息安全管理与评估赛题第2套(下)
一共打算发三套样题 后边给大家发师傅们的学习笔记以及对一些题的理解
1179 0
|
29天前
|
存储 人工智能 自然语言处理
阿里云千问办公详细介绍:QwenWork核心能力、典型场景、价格及常见问题解答FAQ
阿里云千问办公QwenWork是新一代AI办公平台,支持自然语言一键生成PPT、财报分析、网页搭建等成品文件,深度集成钉钉,实现任务自动执行与多模态创作,真正让AI从“写文字”升级为“干实事”。

热门文章

最新文章