IMCI 功能預設使用主鍵來同步資料的更新和刪除。然而,當表沒有主鍵,或主鍵無序(如UUID),資料同步會引發大量隨機 I/O,導致同步效率低下時,預設策略便不再適用。本實踐將介紹如何通過自訂複製鍵,解決這些問題,從而大幅提升資料同步效能。
前提條件
表中存在一個值在實體儲存體上具有單調遞增特性的列。
注意事項
在實施前,請務必關注以下幾點:
必須基於唯一索引:自訂複製鍵必須通過
USING INDEX指定一個唯一索引(Unique Index)。索引列必須非空:用於複製鍵的唯一索引,其包含的列必須定義為
NOT NULL。推薦使用有序索引:為達到最佳效能,強烈建議該唯一索引建立在單調遞增的列上(如
SERIAL或BIGSERIAL類型的自增列)。
工作原理
REPLICA IDENTITY 機制
通過 REPLICA IDENTITY 屬性來決定在邏輯複製的 WAL(Write-Ahead Log)中記錄哪些資訊,以便下遊能夠唯一標識發生變更的行。IMCI 正是利用此機制來定位並更新列存中的資料。REPLICA IDENTITY 支援以下四種模式:
模式 | 含義 | 適用情境 |
| 使用主鍵(Primary Key)作為標識。 | 預設推薦。只要表有主鍵,通常無需修改。 |
| 使用指定的唯一索引(Unique Index)作為標識。 | 當表無主鍵或主鍵無序時,可指定一個有序的唯一索引來提升效率。 |
| 將整行所有列的值都寫入 WAL 作為標識。 | 僅在表既無主鍵也無唯一索引,且必須支援更新/刪除時使用。 |
| 不記錄任何標識資訊。 | 僅適用於只進不出(INSERT)的表,不支援更新或刪除。 |
使用有序唯一索引作為複製鍵
本實踐的核心思想是利用 USING INDEX 模式,將一個基於有序欄位(如自增列)建立的唯一索引指定為複製鍵。
工作流程如下:
建立有序唯一索引:為一個在實體儲存體上有序的列(如
SERIAL類型的自增 ID)建立一個唯一索引。更改複製標識:使用
ALTER TABLE ... REPLICA IDENTITY USING INDEX ...命令,將表的複製鍵切換到新建立的唯一索引。高效邏輯解碼:邏輯複製時,系統會高效地從 WAL 中解碼出有序索引鍵的值。
加速資料同步:IMCI 利用這個有序的索引值在列存中進行資料定位和更新。由於索引值有序,操作將變為高效的順序 I/O,從而大幅提升資料同步效率。
操作指南
步驟一:建立唯一索引
為您的有序自增列建立一個唯一索引。
-- 假設表 t 中存在一個名為 serial_id 的自增列 CREATE UNIQUE INDEX idx_t_serial_id ON t(serial_id);步驟二:更改表的複製標識
將表的
REPLICA IDENTITY切換到上一步建立的唯一索引。ALTER TABLE t REPLICA IDENTITY USING INDEX idx_t_serial_id;步驟三:建立或重建列存索引
確保您的列存索引(CSI)包含了作為複製鍵的列。如果已有列存索引,建議重建以獲得最佳效能。
-- 建立一個包含所有列的列存索引 CREATE INDEX ON t USING csi;步驟四:對比測試
我們通過一個實驗來驗證其效能提升效果。
測試設定:
建立一張包含無序主鍵(
random_id)和有序自增列(serial_id)的表。create table t (random_id text primary key, serial_id serial, a text);插入 1000 萬行資料。
insert into t(random_id, a) select md5(i::text), i::text from generate_series(1, 10000000) i;建立列存索引和有序唯一索引
idx_a(serial_id)。create unique index idx_a on t(serial_id); create index on t using csi;
測試過程:
預設模式測試(使用無序主鍵
random_id作為複製鍵):-- 更新 10000 行資料 UPDATE t SET a = '0' WHERE serial_id <= 10000;自訂模式測試(切換複製鍵為有序唯一索引
idx_a):ALTER TABLE t REPLICA IDENTITY USING INDEX idx_a; -- 再次更新 10000 行資料 UPDATE t SET a = '1' WHERE serial_id <= 10000;
測試結果:
複製鍵類型
預設主鍵(無序)
自訂唯一索引(有序)
同步耗時(1萬條)
~0.5 秒
~0.01 秒
結論分析
測試結果表明,通過將複製鍵從無序的 Primary Key 切換到基於自增列的 Unique Index,資料同步效能獲得了約 50 倍 的巨大提升。這充分證明了自訂有序複製鍵在提升 IMCI 資料同步效率方面的關鍵作用。