标准答案
- 等值条件能把索引前缀固定在很小的连续区间内,后续字段仍可能保持可利用的顺序。
- 范围条件例如 created_at BETWEEN 会展开多个前缀值,后续列无法再保证全局有序。
- ORDER BY 和 GROUP BY 的字段顺序、方向、过滤条件必须与索引顺序兼容,才能减少额外 filesort 或临时表。
- 优化时先决定最重要的是过滤行数、排序成本还是分组扫描,再针对主路径设计索引或拆分查询。
- 通过 EXPLAIN 和实际行数验证,不要仅按口诀判断某个索引“肯定失效”。
题目解析
索引能否同时服务过滤和排序,本质上取决于结果集是否已经以所需顺序连续产出。前缀有范围时,例如多个日期下的 status 值会交错出现,按 status 的全局排序就不能直接从索引顺序得到。
有时额外排序是正确选择。若范围过滤后只剩几十行,强行为了排序增加很宽的索引可能得不偿失;若是高频大分页,则可能需要重新设计查询条件或引入预聚合。
常见误区
- 看到 EXPLAIN 有索引就认为 ORDER BY 没有成本,忽略临时表和排序步骤。
- 为每一种排序组合都新增索引,导致写入和维护成本失控。