![深入理解MySQL主从原理](https://wfqqreader-1252317822.image.myqcloud.com/cover/513/37423513/b_37423513.jpg)
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语句为例进行比较。
建表语句和数据如下。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_58.jpg?sign=1739524125-s8CoRw2SFX8ZjQ8DV13J8pGVvP29AkML-0-2a4a7708aac26e26ca04a28bedecdd22)
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_59.jpg?sign=1739524125-hQBQ6URyVAEMAnHBJsO2HN9KwORgVm21-0-69076bbc68805c865df95132a7945c6b)
执行如下语句。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_60.jpg?sign=1739524125-D7SLHWsn2iQ6CKrv8TgVBa6Cjvc0aJjX-0-5876af84ec683f4253b4b5498dc2230d)
使用mysqlbinlog解析,如下。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_61.jpg?sign=1739524125-ifvUKWsIolHTGw4yXfH7aWSRLkKEUjGw-0-71f4521db1e8e977f909c2511e7a8f01)
下面是语句生成的DELETE_EVENT。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_62.jpg?sign=1739524125-nq6mZzXTr5KR6b9Tz9UJG04pCnYnqn6c-0-0477ddd01eed0957d3870231769b3f3d)
关键部分解析。
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,执行语句如下。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_63.jpg?sign=1739524125-j1Wv07CjJcHXSdWkcTe3t9l4vQfjcogI-0-2b93baf525ade9f41b25f5123e4f17c6)
使用mysqlbinlog解析如下。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_64.jpg?sign=1739524125-fyuoIQ1PFSC7baxMdz0YgVsZsAAZ0y5z-0-d35625ae6a625683308fa85ccda728fa)
下面是DELETE_EVENT:
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_65.jpg?sign=1739524125-N0b4BY7xqa1r7yWwbeEvg2ZBYZh7prI8-0-bfde82980c5d5686463c1f4faf2a34d8)
关键部分解析。
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节详细解释。