文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (美国信函) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


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

19.5.1.28 复制和行搜索

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

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

  • 全文索引。

  • 隐藏索引。

  • 生成的索引。

  • 多值索引。

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

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

  1. 主键。

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

  3. 任何其他索引。如果存在多个此类索引,则该算法选择最左边的索引。

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

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