Postgresql

當我們向具有大量數據的現有表添加索引時會發生什麼?

  • January 6, 2016

我有一個包含大約 1500 萬條記錄的表。現在我需要向表中添加索引。

添加索引需要一些時間來更新表中的每個條目。

我很困惑添加索引是否會導致停機。

如果是,那麼我該如何克服停機時間?

使用 plain CREATE INDEX,表將被鎖定以進行寫入而不是讀取。

也用於CREATE INDEX CONCURRENTLY避免寫鎖。

來自PostgreSQL 文件CREATE INDEX

使用此選項時,PostgreSQL 將建構索引而不使用任何阻止並發插入、更新或刪除表的鎖;而標準索引建構會鎖定表上的寫入(但不讀取),直到完成為止。使用此選項時需要注意幾個注意事項 - 請參閱同時建構索引

更具體地說(就像@ypercube評論的那樣):

PostgreSQL 支持建構索引而不鎖定寫入CONCURRENTLY通過指定 的選項呼叫此方法CREATE INDEX。當使用這個選項時,PostgreSQL 必須對錶執行兩次掃描,此外它必須等待所有可能使用索引的現有事務終止。因此,與標準索引建構相比,此方法需要更多的總工作量,並且需要更長的時間才能完成。但是,由於它允許在建構索引時繼續正常操作,因此此方法對於在生產環境中添加新索引很有用。

大膽強調我的。

引用自:https://dba.stackexchange.com/questions/125132