深入理解MySQL主从原理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.7.3 DML Event中的标识

前文提到过,每个DML Event都包含columns_after_image/columns_before_image位图。但只是简单地说,对于FULL设置始终是0Xff。这里我们就知道了,如果本参数不设置为FULL,那么read_set和write_set最终会分别写入columns_before_image和columns_after_image。

这里以DELETE语句为例进行比较。

建表语句和数据如下。

执行如下语句。

使用mysqlbinlog解析,如下。

下面是语句生成的DELETE_EVENT。

关键部分解析。

ff:binlog_row_image为FULL,就是记录十六进制值ff。

f8:十六进制值f8转换为二进制值为11111000,参考2.5节。

01 00 00 00:实际数据的第一个字段为数字1。

0a 00 00 00:实际数据的第二个字段为数字10。

07 67 61 6f 70 65 6e 67:实际数据字符串gaopeng的ASCII码。

修改参数binlog_row_image为MINIMAL,执行语句如下。

使用mysqlbinlog解析如下。

下面是DELETE_EVENT:

关键部分解析。

02:十六进制值02,即二进制值00000010,这里是位图的表示方式。说明第二个字段是需要记录到Event的。

fe:十六进制值fe,即二进制值11111110,参考2.5节。

14 00 00 00:实际的数据,十六进制值14,即十进制值20。

我们清楚地看到before_image值记录非空唯一键的值。如果从库本表的结构和主库不同,不包含主键和非空唯一键,只有一个a列上的索引,那么由于主库参数binlog_row_image被设置为MINIMAL,这个索引是用不到的,将会引起全表扫描。这是因为a列的值根本就不会在Event中记录。但是如果参数binlog_row_image被设置为FULL,那么a列上的索引是可以使用的,这是因为Event中记录了全部字段的值。关于从库数据的查找将会在4.6节详细解释。