从一次慢查询说起:给 MySQL 加索引前,先看懂执行计划

举报
yd_287404535 发表于 2026/10/23 21:01:37 2026/10/23
【摘要】 前几天,一张只有几万行的订单表,查一个用户最近 30 天的订单居然要两秒多。第一反应是“加个索引吧”,但加索引之前,我先跑了一次 EXPLAIN——这一步,决定了后面是真优化,还是把问题藏得更深。先看 type 和 rows。type 是 ALL,基本就是全表扫描;rows 很大,说明它扫描后还要再过滤。很多慢查询不是数据量大,而是条件根本没有走到索引。接着看 key:如果 key 是空,说...

前几天,一张只有几万行的订单表,查一个用户最近 30 天的订单居然要两秒多。第一反应是“加个索引吧”,但加索引之前,我先跑了一次 EXPLAIN——这一步,决定了后面是真优化,还是把问题藏得更深。先看 type 和 rows。type 是 ALL,基本就是全表扫描;rows 很大,说明它扫描后还要再过滤。很多慢查询不是数据量大,而是条件根本没有走到索引。接着看 key:如果 key 是空,说明没有用上任何索引;如果 key 有值,再看 Extra 里有没有 Using filesort、Using temporary,这两个出现,排序和临时表往往就是耗时的大头。那次的问题其实很典型:查询条件是 user_id 和 created_at,表上却只有一个主键索引。加索引时,顺序也很关键。把等值条件放前面、范围条件放后面,例如先 user_id、再 created_at,多数情况下比反过来更有效。最左前缀原则说白了就是:索引从左到右用,中间断了,后面就用不上。加完索引后,别只看一次查询变快了,要再跑一次 EXPLAIN,确认 type 从 ALL 变成了 ref 或 range,rows 明显下降,Extra 里不再出现 filesort。索引不是越多越好,每多一个索引,写入就要多维护一份,读快了、写慢了也可能是新的问题。我的习惯是:先 EXPLAIN 定位,再加索引,最后再 EXPLAIN 验证——三步走完,才算一次完整的慢查询处理。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。