文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  复制和行搜索

19.5.1.27 复制和行搜索

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

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

  • 全文索引。

  • 隐藏索引。

  • 生成的索引。

  • 多值索引。

  • 任何在行事件的之前图像中不包含索引所有列的索引。

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

  1. 主键。

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

  3. 任何其他索引。如果有多个此类索引可用,则该算法选择这些索引中最左边的索引。

如果该算法能够选择一个主键或一个唯一索引,其中索引中的每一列都有 NOT NULL 属性,则它使用此索引迭代 UPDATEDELETE 操作中的行。对于行事件中的每一行,该算法在索引中查找该行以定位要更新的表记录。如果未找到匹配的记录,则返回错误 ER_KEY_NOT_FOUND 并停止复制应用器线程。

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