當使用資料列型複製格式的副本套用 UPDATE
或 DELETE
操作時,它必須在相關資料表中搜尋符合的資料列。用於執行此程序的演算法會優先選擇使用資料表的索引來執行搜尋,如果沒有合適的索引,則使用雜湊表。
演算法首先評估資料表定義中可用的索引,以查看是否有任何合適的索引可供使用,如果有數個可能性,則會選擇最適合該操作的索引。該演算法會忽略以下類型的索引:
全文索引。
隱藏索引。
產生索引。
多值索引。
任何資料列事件的前影像不包含索引所有欄位的索引。
如果排除這些索引類型後沒有合適的索引,則演算法不會使用索引進行搜尋。如果有合適的索引,則會依下列優先順序從候選索引中選取一個索引:
主鍵。
唯一索引,其中索引中的每個欄位都具有 NOT NULL 屬性。如果有一個以上的這類索引可用,則演算法會選擇這些索引最左邊的索引。
任何其他索引。如果有一個以上的這類索引可用,則演算法會選擇這些索引最左邊的索引。
如果演算法能夠選取一個主索引鍵或唯一索引,且該索引中的每個欄位都具有 NOT NULL
屬性,它會使用此索引來迭代 UPDATE
或 DELETE
操作中的資料列。針對資料列事件中的每個資料列,演算法會在索引中查找該資料列,以找出要更新的資料表記錄。如果找不到相符的記錄,則會傳回錯誤 ER_KEY_NOT_FOUND 並停止複寫應用程式執行緒。
如果演算法無法找到合適的索引,或只能找到非唯一或包含空值的索引,則會使用雜湊表來協助識別資料表記錄。演算法會建立一個雜湊表,其中包含 UPDATE
或 DELETE
操作中的資料列,並以資料列的完整前映像作為鍵。然後,演算法會迭代目標資料表中的所有記錄,如果找到索引,則使用所選的索引,否則執行完整資料表掃描。針對目標資料表中的每個記錄,它會判斷該資料列是否存在於雜湊表中。如果在雜湊表中找到該資料列,則更新目標資料表中的記錄,並從雜湊表中刪除該資料列。當檢查完目標資料表中的所有記錄後,演算法會驗證雜湊表現在是否為空。如果雜湊表中仍有任何不匹配的資料列,則演算法會傳回錯誤 ER_KEY_NOT_FOUND 並停止複寫應用程式執行緒。