当使用基于行的复制格式的副本应用 UPDATE
或 DELETE
操作时,它必须搜索相关表以查找匹配的行。用于执行此过程的算法首先选择表的索引之一来执行搜索,如果找不到合适的索引,则使用哈希表。
该算法首先评估表定义中可用的索引,以查看是否存在任何合适的索引可以使用,以及如果有多个可能性,哪个索引最适合该操作。该算法忽略以下类型的索引
全文索引。
隐藏索引。
生成的索引。
多值索引。
任何索引,其中行事件的之前映像不包含索引的所有列。
如果在排除这些索引类型后没有合适的索引,则该算法不会使用索引进行搜索。如果存在合适的索引,则会从候选者中选择一个索引,优先顺序如下
主键。
唯一索引,其中索引中的每一列都具有 NOT NULL 属性。如果存在多个此类索引,则该算法选择最左边的索引。
任何其他索引。如果存在多个此类索引,则该算法选择最左边的索引。
如果该算法能够选择主键或唯一索引,其中索引中的每一列都具有 NOT NULL
属性,则它将使用此索引来迭代 UPDATE
或 DELETE
操作中的行。对于行事件中的每一行,该算法都会在索引中查找该行以定位要更新的表记录。如果找不到匹配的记录,它将返回错误 ER_KEY_NOT_FOUND 并停止复制应用程序线程。
如果该算法无法找到合适的索引,或者只能找到非唯一或包含空值的索引,则将使用哈希表来帮助识别表记录。该算法将创建一个包含 UPDATE
或 DELETE
操作中的行的哈希表,其中键是行的完整之前映像。然后,该算法遍历目标表中的所有记录,使用选定的索引(如果找到了),否则执行全表扫描。对于目标表中的每个记录,它都会确定该行是否存在于哈希表中。如果在哈希表中找到了该行,则更新目标表中的记录,并将该行从哈希表中删除。当检查完目标表中的所有记录后,该算法会验证哈希表是否现在为空。如果哈希表中还有任何不匹配的行,则该算法将返回错误 ER_KEY_NOT_FOUND 并停止复制应用程序线程。