标准答案

  1. 等值条件能把索引前缀固定在很小的连续区间内,后续字段仍可能保持可利用的顺序。
  2. 范围条件例如 created_at BETWEEN 会展开多个前缀值,后续列无法再保证全局有序。
  3. ORDER BY 和 GROUP BY 的字段顺序、方向、过滤条件必须与索引顺序兼容,才能减少额外 filesort 或临时表。
  4. 优化时先决定最重要的是过滤行数、排序成本还是分组扫描,再针对主路径设计索引或拆分查询。
  5. 通过 EXPLAIN 和实际行数验证,不要仅按口诀判断某个索引“肯定失效”。

题目解析

索引能否同时服务过滤和排序,本质上取决于结果集是否已经以所需顺序连续产出。前缀有范围时,例如多个日期下的 status 值会交错出现,按 status 的全局排序就不能直接从索引顺序得到。

有时额外排序是正确选择。若范围过滤后只剩几十行,强行为了排序增加很宽的索引可能得不偿失;若是高频大分页,则可能需要重新设计查询条件或引入预聚合。

常见误区

  • 看到 EXPLAIN 有索引就认为 ORDER BY 没有成本,忽略临时表和排序步骤。
  • 为每一种排序组合都新增索引,导致写入和维护成本失控。

作者信息