← 中文资源

简体中文版本

审计 PostgreSQL 未使用索引

用 pg_stat_user_indexes 找出从未被扫描的索引,确认不是唯一约束后安全删除,降低写入放大。

阅读英文原文

目标

随时间累积的索引拖慢插入吞吐,团队怀疑很多索引从未被查询使用。本配方从统计视图找出扫描次数为零的索引及其体积,优先审查最大的写入放大来源,并在删除前确认该索引不是唯一或主键约束,从而在可控风险下清理无用索引。

步骤要点

  1. 从 pg_stat_user_indexes 列出扫描为零的索引及其大小。
  2. 对候选索引检查 indisunique 与 indisprimary。
  3. 核对一段完整业务周期,避免月末报表类索引被误删。
  4. 删除后观察写入延迟与热点查询计划是否变化。
SELECT schemaname, relname, indexrelname, idx_scan, pg_size_pretty(pg_relation_size(indexrelid)) AS size
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;

排错提示

  • 统计若刚重置会误导,需等完整周期。
  • 极少使用不等于无用,可能只在月末使用。
  • 删除可能拖慢部分报表,需先看执行计划。

适用边界

  • 统计可能遗漏极少使用的索引。
  • 不覆盖约束维护的索引。