用途:在 PostgreSQL 中创建、修改、验证、删除和重建索引,排查慢查询与缺失索引,处理分区表(如 findings、resource_finding_mappings)索引,并在索引变更后执行 VACUUM 或 ANALYZE。
索引设计:固定值列(如 state = 'completed')应放入部分索引的 WHERE 子句而非索引键,避免破坏排序利用;高选择性列放前面,复合索引最左列须出现在查询 WHERE 中。
验证效果:新增索引后务必执行 EXPLAIN (ANALYZE, BUFFERS) 确认使用情况;测试时可用 SET enable_seqscan = off,验证后须重新开启,切勿在生产长期关闭。
冗余与未用索引:列相同或一者为另一者前缀即冗余,顺序与 WHERE 子句需一致。通过 pg_stat_all_indexes 查找 idx_scan = 0 的索引,删前确认统计未重置、覆盖至少一个月、并在主从节点核查。
并发操作:生产环境建删索引使用 CREATE INDEX CONCURRENTLY IF NOT EXISTS 与 DROP INDEX CONCURRENTLY IF EXISTS;后者不能在事务块内执行。并发创建可能静默失败产生无效索引,需用 pg_index.indisvalid 校验。中断可能残留 _ccnew(删除后重试 REINDEX CONCURRENTLY)与 _ccold(可安全删除)。
分区表:避免 ALTER INDEX ATTACH PARTITION,改为先在子分区并发建索引,再在父表建同名同定义索引;优先为活跃分区建索引。可用 pg_stat_progress_create_index 监控进度,psql 中配合 \watch 5 刷新。
维护:VACUUM 不会重建 B-tree,膨胀超 50% 可考虑 REINDEX CONCURRENTLY;多索引重建时按表哈希分配会话避免死锁。删除索引后执行 VACUUM (ANALYZE) 或 ANALYZE。
限制:部分细节如具体阈值、Context7 MCP 安装步骤与 pev 使用方式资料未完整提供。