文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美國信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  複製和列搜尋

19.5.1.28 複製和列搜尋

當使用基於列的複製格式的複本套用 UPDATEDELETE 操作時,它必須在相關表格中搜尋符合的列。用於執行此程序的演算法會優先使用表格的其中一個索引來執行搜尋,如果沒有合適的索引,則會使用雜湊表。

該演算法首先評估表格定義中可用的索引,以查看是否有任何合適的索引可以使用,如果有許多可能性,則哪個索引最適合該操作。該演算法會忽略以下類型的索引

  • 全文索引。

  • 隱藏索引。

  • 產生索引。

  • 多值索引。

  • 任何在列事件的 before-image 中未包含索引所有欄位的索引。

如果在排除這些索引類型後沒有合適的索引,則該演算法不會使用索引進行搜尋。如果有合適的索引,則會從候選索引中選取一個索引,優先順序如下

  1. 主索引鍵。

  2. 唯一索引,其中索引中的每個欄位都有 NOT NULL 屬性。如果有多個此類索引可用,則該演算法會選擇最左邊的索引。

  3. 任何其他索引。如果有多個此類索引可用,則該演算法會選擇最左邊的索引。

如果該演算法能夠選取主索引鍵或唯一索引,其中索引中的每個欄位都有 NOT NULL 屬性,則它會使用此索引來反覆運算 UPDATEDELETE 操作中的列。對於列事件中的每一列,該演算法會在索引中查詢該列,以找到要更新的表格記錄。如果找不到符合的記錄,它會傳回錯誤 ER_KEY_NOT_FOUND 並停止複製套用程式執行緒。

如果演算法無法找到合適的索引,或者只能找到非唯一或包含空值的索引,則會使用雜湊表來協助識別表格記錄。演算法會建立一個雜湊表,其中包含 UPDATEDELETE 操作中的資料列,並以資料列的完整前映像作為鍵。接著,演算法會迭代目標表格中的所有記錄,如果找到索引則使用該索引,否則執行完整表格掃描。對於目標表格中的每個記錄,演算法會判斷該資料列是否存在於雜湊表中。如果該資料列在雜湊表中找到,則更新目標表格中的記錄,並從雜湊表中刪除該資料列。當檢查完目標表格中的所有記錄後,演算法會驗證雜湊表是否為空。如果雜湊表中仍有任何未比對的資料列,則演算法會回傳錯誤 ER_KEY_NOT_FOUND 並停止複製套用程式執行緒。