PostgreSQL 教程: REINDEX 重建索引

九月 12, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的REINDEX语句重建一个或多个索引。

PostgreSQL REINDEX 语句简介

实际上,由于硬件故障或软件错误,索引可能会损坏并且不再包含有效数据。要恢复索引,可以使用REINDEX语句:

REINDEX [ ( VERBOSE ) ] { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } name;

在此语法中,VERBOSE关键字是可选的。如果包含VERBOSE关键字,则在重建每个索引时该语句会显示进度报告。

要重新创建单个索引,请在REINDEX INDEX子句后指定索引名称,如下所示:

REINDEX INDEX index_name;

要重新创建表的所有索引,请使用TABLE关键字并指定表的名称:

REINDEX TABLE table_name;

如果要重建模式中的所有索引,请使用SCHEMA关键字后跟模式名称:

REINDEX SCHEMA schema_name;

要重建特定数据库中的所有索引,请在REINDEX DATABASE子句后指定数据库名称:

REINDEX DATABASE database_name;

以下语句在特定数据库中重新创建系统模式中的所有索引:

REINDEX SYSTEM database_name;

REINDEX 对比 DROP INDEX 和 CREATE INDEX

REINDEX语句从头开始重建索引内容,这与删除并重新创建索引具有类似的效果。然而,它们之间的锁定机制是不同的。

REINDEX语句:

  • 锁定索引所属表的写入操作,但不锁定读取操作。
  • 对正在处理的索引采取独占锁,这会阻止尝试使用该索引的读取。

DROP INDEXCREATE INDEX语句:

  • 首先,DROP INDEX通过获取表上的排他锁来锁定索引所属表的写入和读取。
  • 然后,CREATE INDEX语句将锁定索引父表的写入操作,但不会锁定读取操作。但是,在创建索引期间读取可能会很昂贵。

在本教程中,您学习了如何使用 PostgreSQL 的REINDEX语句删除并重新创建一个或多个索引。