
PostgreSQL 的 MVCC 机制下,UPDATE 与 DELETE 不会原地清理旧版本行,索引条目同样留下死元组。长期运行的 OLTP 库里,索引体积达到合理值的 2~5 倍很常见——查询多扫的每一页都是 IO,缓存命中率被无效页稀释,这就是索引膨胀(Index Bloat)。它不报错、不告警,只会让系统慢慢变慢。一、先量化:膨胀了多少
两条常用手段:
SELECT * FROM pgstatindex('idx_orders_user_id'); 返回 leaf_fragmentation、avg_leaf_density 等指标——密度低于 70% 说明膨胀明显;监控上把「索引大小 / 表大小比值 + avg_leaf_density」做成周报,膨胀趋势比绝对值更重要。
_ccnew 后缀的无效索引,需要手动清理;选择逻辑:PG 12 以上默认 REINDEX CONCURRENTLY;要对表本身(死元组、大表 rewrite)一起处理用 pg_repack 或逻辑迁移。


索引维护是 PostgreSQL 运维的「牙齿保健」——日常不护理,问题出现时就是大手术。把膨胀监控做成例行项,配合 CONCURRENTLY 重建,数据库的查询延迟曲线会平稳得多。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。