标准答案
- 高基数如订单号、用户 ID 通常能把查询定位到少量行,适合作为等值查询或联合索引的一部分。
- 低基数如状态、布尔值单独索引可能需要命中大量行,优化器可能宁可全表扫。
- 低基数字段与 tenant_id、时间或其他高选择性列组合时,仍可能构成有价值的联合索引。
- 数据分布比基数更重要:一个状态字段只有几个值,但某个罕见错误状态可能非常适合索引。
- 索引会增加写入、存储和维护成本,应基于真实 SQL、行数和执行计划验证。
题目解析
“低基数字段不要索引”是过度简化。比如租户内按 status 查询最近记录时,(tenant_id, status, created_at) 可能恰好服务最重要的列表路径;若只建 status 单列索引,确实可能没有收益。
类型也不能决定是否索引。VARCHAR、JSON、时间和数字字段都可能因查询方式不同而适合或不适合索引,关键在可检索表达式和选择性。
常见误区
- 看见布尔字段就绝不建索引,忽略它与租户、时间组合后的常用查询。
- 只看总基数,不检查某个热点值占了绝大多数行导致计划失真。