全部產品
Search
文件中心

PolarDB:自訂資料複製鍵

更新時間:Mar 28, 2026

IMCI 功能預設使用主鍵來同步資料的更新和刪除。然而,當表沒有主鍵,或主鍵無序(如UUID),資料同步會引發大量隨機 I/O,導致同步效率低下時,預設策略便不再適用。本實踐將介紹如何通過自訂複製鍵,解決這些問題,從而大幅提升資料同步效能。

前提條件

表中存在一個值在實體儲存體上具有單調遞增特性的列。

注意事項

在實施前,請務必關注以下幾點:

  • 必須基於唯一索引:自訂複製鍵必須通過 USING INDEX 指定一個唯一索引(Unique Index)。

  • 索引列必須非空:用於複製鍵的唯一索引,其包含的列必須定義為 NOT NULL

  • 推薦使用有序索引:為達到最佳效能,強烈建議該唯一索引建立在單調遞增的列上(如 SERIAL 或 BIGSERIAL 類型的自增列)。

工作原理

REPLICA IDENTITY 機制

通過 REPLICA IDENTITY 屬性來決定在邏輯複製的 WAL(Write-Ahead Log)中記錄哪些資訊,以便下遊能夠唯一標識發生變更的行。IMCI 正是利用此機制來定位並更新列存中的資料。REPLICA IDENTITY 支援以下四種模式:

模式

含義

適用情境

DEFAULT

使用主鍵(Primary Key)作為標識。

預設推薦。只要表有主鍵,通常無需修改。

USING INDEX

使用指定的唯一索引(Unique Index)作為標識。

當表無主鍵或主鍵無序時,可指定一個有序的唯一索引來提升效率。

FULL

將整行所有列的值都寫入 WAL 作為標識。

僅在表既無主鍵也無唯一索引,且必須支援更新/刪除時使用。

NOTHING

不記錄任何標識資訊。

僅適用於只進不出(INSERT)的表,不支援更新或刪除。

使用有序唯一索引作為複製鍵

本實踐的核心思想是利用 USING INDEX 模式,將一個基於有序欄位(如自增列)建立的唯一索引指定為複製鍵。

工作流程如下:

  1. 建立有序唯一索引:為一個在實體儲存體上有序的列(如 SERIAL 類型的自增 ID)建立一個唯一索引。

  2. 更改複製標識:使用 ALTER TABLE ... REPLICA IDENTITY USING INDEX ... 命令,將表的複製鍵切換到新建立的唯一索引。

  3. 高效邏輯解碼:邏輯複製時,系統會高效地從 WAL 中解碼出有序索引鍵的值。

  4. 加速資料同步: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;
  • 步驟四:對比測試

    我們通過一個實驗來驗證其效能提升效果。

    • 測試設定:

      1. 建立一張包含無序主鍵(random_id)和有序自增列(serial_id)的表。

        create table t (random_id text primary key, serial_id serial, a text);
      2. 插入 1000 萬行資料。

        insert into t(random_id, a)
          select md5(i::text), i::text
            from generate_series(1, 10000000) i;
      3. 建立列存索引和有序唯一索引 idx_a(serial_id)

        create unique index idx_a on t(serial_id);
        create index on t using csi;
    • 測試過程:

      1. 預設模式測試(使用無序主鍵 random_id 作為複製鍵):

        -- 更新 10000 行資料
        UPDATE t SET a = '0' WHERE serial_id <= 10000;
      2. 自訂模式測試(切換複製鍵為有序唯一索引 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 資料同步效率方面的關鍵作用。