MySQL查询慢不能只靠加索引,关键要读懂EXPLAIN的type、key、rows、Extra字段:type为ALL表示全表扫描,key为NULL未必真失效,rows是预估扫描行数,Extra出现Using filesort或temporary是性能红灯。
MySQL 查询慢,不是加索引就能解决的;真正卡住你的,往往是 EXPLAIN 看不懂、执行计划里 type 是 ALL 却没意识到全表扫描、或者 key 显示 NULL 却以为索引“失效”了。
怎么看懂 EXPLAIN 输出里的关键字段
EXPLAIN 不是只看有没有用上索引,重点在 type、key、rows、Extra 四个字段:
-
type从好到差:const≈eq_ref>ref>range>index>ALL。出现ALL基本等于没走有效索引,哪怕key列显示有值 -
key是实际被选用的索引名;NULL表示没走索引,但也要结合possible_keys看——如果后者非空而前者为NULL,说明优化器认为走索引反而更慢 -
rows是预估扫描行数,不是结果行数;它远大于实际返回行(比如SELECT COUNT(*)返回 1 行,rows=100000)就值得警惕 -
Extra里出现Using filesort或Using temporary是性能红灯,尤其二者同时出现,基本意味着排序+分组逻辑无法利用索引完成
为什么 ORDER BY 加了索引还是 Using filesort
索引能避免排序,前提是查询条件和排序字段共同满足「最左前缀 + 顺序一致」。常见失效场景: