标准答案

  1. partial index 适合状态分布稳定且访问集中在子集的场景,例如只索引未完成订单;查询条件需要与谓词兼容,规划器才能安全使用。
  2. expression index 适合规范化、截取或计算后的值,例如 lower(email);查询也要使用等价表达式,不能只对原字段查询就期待自动命中。
  3. 表达式中的函数、排序规则、时区和数据类型会影响结果稳定性;依赖当前时间或会变化的环境状态通常不适合作为索引表达式。
  4. partial index 的谓词不是数据权限机制,也不会自动把查询限制到有效记录;应用和数据库约束仍需共同保证语义。
  5. 创建后要观察索引使用率、写放大、数据分布变化和计划;如果热点状态比例发生变化,原来的 partial index 可能不再划算。

题目解析

partial index 的收益来自“索引更小、热点更集中”,代价是查询必须与谓词对齐。比如索引只覆盖 status = pending 的记录,查询写成无法证明状态条件的复杂表达式时,规划器可能不能使用它。

expression index 解决的是访问规范化后的值,而不是让数据库理解任意业务函数。函数的稳定性、collation 和类型转换都应成为索引设计的一部分。

这类索引适合有明确访问边界的表,不适合为了绕过数据建模问题堆叠多个表达式索引;最终仍要用执行计划和写入压测验收。

常见误区

  • 误区:创建 partial index 后所有查询都会自动过滤到该子集。改正:查询必须包含或能推导出兼容谓词,数据权限仍需单独校验。
  • 误区:用 now() 等当前时间表达式做索引。改正:索引表达式需要稳定语义,时间窗口应通过可维护的列或分区设计表达。
  • 误区:expression index 解决了所有大小写和排序问题。改正:还要确认 collation、类型转换、函数稳定性和查询表达式完全一致。

作者信息