索引维护

本页目录

在大型项目中,索引维护是不可避免的。越早建立维护流程,性能表现会越好。

分析索引健康状况

索引健康分析包括:

无效索引

查找无效索引非常简单:

PSQL
nik=# select indexrelid, indexrelid::regclass, indrelid::regclass
from pg_index
where not indisvalid;
 indexrelid | indexrelid | indrelid
------------+------------+----------
      49193 | t_id_idx   | t1
(1 row)

在 Postgres DBA 中可以找到更全面详细的查询。

在分析这个列表时,请记住,如果索引正在通过 CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY 创建或重建,无效索引可能是正常情况,因此还值得检查 pg_stat_activity 以识别此类进程。

其他无效索引必须重建 (REINDEX CONCURRENTLY) 或删除 (DROP INDEX CONCURRENTLY)。

膨胀索引

如何分析索引膨胀:参照 Day 46: How to deal with bloat

膨胀程度较高的索引 (真实的或预估的) 超过 50%,必须通过 REINDEX CONCURRENTLY 进行重建。

由于随着时间的推移,索引健康状况会因更新而下降,因此需要重新索引。以下方法可以帮助减缓这种下降:

因此,你需要定期对已知膨胀的索引使用 REINDEX CONCURRENTLY。理想情况下,这个过程应该自动化。例如:pg_auto_reindexer。

未使用的索引

可以在 pg_stat_user_indexes 中找到使用信息。Postgres DBA 中提供了一个用于分析的查询示例。

在查找未使用的索引时,请保持谨慎,避免错误:

一旦可靠地识别出未使用的索引,那么应该使用 DROP INDEX CONCURRENTLY 进行删除。

我们能否软删除索引 (将其"隐藏"以确保计划器行为不变,如果没有问题,再执行真正的删除,否则快速恢复至原始状态)?不幸的是,这里没有简单的答案:

冗余索引

如果索引 B 可以有效地支持与索引 A 相同 (甚至更多) 的查询集,那么索引 A 相对于索引 B 是冗余的。几个例子:

具有完全相同定义的索引是彼此冗余的 (即重复索引)。

可以在 Postgres DBA 或 Postgres Checkup 中找到用于识别冗余索引的查询示例。

冗余索引通常可以安全删除 (在手动仔细检查列表后),即使要删除的索引当前正在使用。

损坏

使用 pg_amcheck 识别 btree 索引中的损坏情况 (详细内容将在另一篇操作指南中介绍)。

截至 2023 年/PG16,pg_amcheck 还不支持以下功能,但未来有计划添加:

讨论与补充

在 GitHub 查看讨论

支持作者

感谢支持 PostgreSQL Howto 的长期维护。

微信赞赏码

读者交流群

二维码若已过期,可通过公众号 PostgreSQL 学徒或邮件联系。

PostgreSQL 学徒读者交流群二维码