所有文章是按github的markdown格式书写的,如此页面显示不正常,请跳转到github版

疑问

MySQL 存储innodb引擎会对无主键的表创建一个内部的Rowid。 之前有一个疑问,复制模式为row时,从库回放update语句时会不会利用这个内部的Rowid识别数据从而避免全表扫描呢?

结论

经过实测(MySQL 5.7),得出结论是不会,也不能

  1. Rowid是MySQL内部数据,外部无法查询和修改。
  2. 对于无主键表,master和slave的内部Rowid不一定相同。
  3. 对于无主键表,slave通过所有字段值的组合去识别行。 这和PG的REPLICA IDENTITY FULL是一个道理。区别这是MySQL的默认设置,而且是全局参数;PG则需要显式的按表设置。

举例

master

mysql> select * from tbk1;
+----+------+
| id | c1   |
+----+------+
|  1 | xx   |
+----+------+

slave

mysql> select * from tbk1;
+----+------+
| id | c1   |
+----+------+
|  1 | yy   |
+----+------+

在master上执行以下SQL

update tbk1 set c1='xx1';
  • 如果id是主键,这个SQL在从库可以回放成功;
  • 如果tbk1表没有主键,这个SQL在从库回放失败,复制中断。(设置set global slave_exec_mode='idempotent'可以容错)
March 19, 2020