标准答案
- 先收集高频 SQL 和参数分布,标出等值过滤、范围过滤、排序、连接和返回列,再决定索引是否需要覆盖查询。
- B-tree 对左侧前缀有更直接的查找能力;等值列通常可以先缩小范围,范围列和排序列的效果要结合具体计划判断。
- 范围条件可能减少后续列继续缩小扫描范围的能力,但后续列仍可能参与索引过滤或排序,不能把“最左匹配”简化成绝对规则。
- 相近查询可以共享索引,但一个超宽索引会增加写入、VACUUM、缓存和构建成本;还要清理重复或没有收益的索引。
- 变更后比较实际行数、计划、P99、写入吞吐和索引大小,避免只用一条样例 SQL 判断顺序正确。
题目解析
索引顺序服务的是访问路径,不是字段排名。一个查询按 tenant_id 等值过滤再按 created_at 分页时,租户范围和稳定排序往往比单列基数更重要。
复合索引还涉及排序和分页:如果索引顺序与 ORDER BY 一致,可以减少额外排序,但必须处理相同时间戳、NULL 和稳定 tie-breaker。
同一个索引可能改善读请求却拖慢写入;生产决策应把 SQL 负载、写放大、缓存和维护窗口一起算,而不是只看单次执行时间。
常见误区
- 误区:只按列基数从高到低排列。改正:先看最常见的等值前缀、排序和范围访问路径。
- 误区:一个索引覆盖所有字段就最省事。改正:宽索引会增加写入和维护成本,应按查询族拆分并验证收益。
- 误区:只用一条样例 SQL 判断索引顺序。改正:要覆盖真实参数分布、热点租户、空结果和大结果集。