用途:在查询变慢、需要决定创建哪种索引、审计表缺失或冗余索引时使用。核心原则是按查询所需的操作符类选择访问方法,而非凭习惯。
主要能力:PostgreSQL 六种内置索引方法的能力区分——B-tree(等值、范围、BETWEEN/IN、IS NULL、前缀 LIKE、排序输出,唯一支持 UNIQUE 与主键);GIN(jsonb、数组、全文、pg_trgm,查询快、更新慢);GiST(范围、几何、排除约束、k 近邻、全文);SP-GiST(非平衡结构、IP 前缀、文本前缀,仅单列);BRIN(物理顺序与列相关的大表,体积极小);Hash(仅等值,默认选 B-tree)。三种正交修饰:partial(部分行)、expression(表达式,须字节级匹配查询表达式且仅 IMMUTABLE 函数)、INCLUDE(v11+ 非键负载列以支持仅索引扫描)。
使用方式:多列索引把等值列放前、范围/排序列放最后;低基数列用部分索引;jsonb/数组用 GIN(jsonb_path_ops 仅支持 @>,jsonb_ops 还支持 ? ?| ?&);范围重叠与排除约束用 GiST 配合 EXCLUDE;超大追加型表用 BRIN;覆盖查询用 INCLUDE。生产库用 CREATE INDEX CONCURRENTLY 避免 ACCESS EXCLUSIVE 锁。必须为每个外键的子表列建索引。
限制与注意:CONCURRENTLY 不能在事务块内运行,失败会留下 INVALID 索引需删除或 REINDEX。部分索引仅当查询 WHERE 在数学上蕴含索引谓词时可用。表达式索引需在创建后运行 ANALYZE。BRIN 在列与物理顺序不相关时退化为全扫描。非 IMMUTABLE 函数报 SQLSTATE 42P17。避免冗余索引、低基数布尔上的普通 B-tree、范围列居首、隐式类型转换使索引失效等问题。
该技能不用于解读 EXPLAIN(见 postgres-impl-explain-analyze)、JSONB 操作符选择、VACUUM/膨胀处理及 PostGIS 空间索引细节。