4.1.27复制和行搜索

当使用基于行的复制格式的副本应用更新删除操作时,它必须在相关表中搜索匹配的行。执行此过程的算法使用表的一个索引作为首选来执行搜索,如果没有合适的索引则使用哈希表。

该算法首先评估表定义中的可用索引,以查看是否有任何适合使用的索引,如果有多个可能性,则哪个索引最适合该操作。该算法忽略了以下类型的索引:

  • 全文索引。

  • 隐藏的索引。

  • 生成的索引。

  • 多值索引。

  • 行事件的前映像不包含索引的所有列的任何索引。

如果在排除这些索引类型后没有合适的索引,算法将不使用索引进行搜索。如果有合适的索引,则从候选索引中选择一个索引,优先级顺序如下:

  1. 一个主键。

  2. 唯一索引,其中索引中的每一列都有一个NOT NULL属性。如果有多个这样的索引可用,算法将选择这些索引中最左边的一个。

  3. 任何其他指数。如果有多个这样的索引可用,算法将选择这些索引中最左边的一个。

如果算法能够选择一个主键或唯一索引,其中索引中的每一列都有非空属性中的行进行迭代时,将使用此索引更新删除操作。对于row事件中的每一行,算法查找索引中的行,以定位要更新的表记录。如果没有找到匹配的记录,则返回错误ER_KEY_NOT_FOUND并停止复制应用程序线程。

如果算法无法找到合适的索引,或者只能找到非唯一的索引或包含空值的索引,则使用哈希表来帮助识别表记录。方法中的行创建一个哈希表更新删除操作,以键作为该行的完整前映像。然后,算法遍历目标表中的所有记录,如果找到一个,则使用所选索引,否则执行全表扫描。对于目标表中的每条记录,它确定该行是否存在于哈希表中。如果在哈希表中找到该行,则更新目标表中的记录,并从哈希表中删除该行。当检查了目标表中的所有记录后,算法验证哈希表现在是否为空。如果哈希表中还有任何不匹配的行,算法将返回错误ER_KEY_NOT_FOUND并停止复制应用程序线程。

slave_rows_search_algorithms系统变量以前用于控制如何搜索匹配的行。现在不建议使用这个系统变量,因为默认设置(如上所述,它使用索引扫描,然后是散列扫描)对于性能是最优的,并且在所有场景下都能正确工作。