当我们在一个有大量数据的现有表中添加索引时会发生什么?

Har*_*ren 11 postgresql index concurrency locking

我有一个包含大约 1500 万条记录的表。现在我需要向表中添加一个索引。

添加索引需要一些时间来更新表中的每个条目。

我很困惑添加索引是否会导致停机。

如果是,那么我怎样才能克服停机时间?

Fab*_*oni 10

使用 plain CREATE INDEX,表将被锁定以进行写入而不是读取。

CREATE INDEX CONCURRENTLY用于避免写锁。

来自PostgreSQL 文档CREATE INDEX

使用此选项时,PostgreSQL 将在不使用任何锁的情况下构建索引,以防止在表上并发插入、更新或删除;而标准索引构建会锁定表上的写入(但不会读取),直到完成为止。使用此选项时需要注意几个注意事项 - 请参阅同时构建索引

更具体的(像@ypercube评论):

PostgreSQL 支持在不锁定写入的情况下构建索引。通过指定 的CONCURRENTLY选项来调用此方法CREATE INDEX。使用此选项时,PostgreSQL 必须对表执行两次扫描,此外它还必须等待所有可能使用索引的现有事务终止。因此,此方法需要比标准索引构建更多的总工作,并且需要更长的时间才能完成。但是,由于它允许在构建索引时继续正常操作,因此此方法对于在生产环境中添加新索引很有用。

大胆强调我的。