![深入理解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=1739286998-TfgCXmGyzYtMf5z3g8buG54T7ZjUTQeK-0-5c9f51e9fc0f64250e867cb5ca155e6a)
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_59.jpg?sign=1739286998-JCTocB9q5UgEb0LmEOXtPgCcXsKm3La7-0-059d50efef8c7a68f90a24e59ca45a16)
执行如下语句。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_60.jpg?sign=1739286998-DWl5pt3Pb5i03YoadRPY4B7nzdzDmqFi-0-275f893f2f1aa1ff064b981fe1364f28)
使用mysqlbinlog解析,如下。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_61.jpg?sign=1739286998-cs8X9Dvrg48OeIaVfZLqGHBXty3ZHWLr-0-dfd1bb4ddf7fb9f93022308f287ca796)
下面是语句生成的DELETE_EVENT。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_62.jpg?sign=1739286998-Fc5EMrzBo8Qtntrh6RygrGOfUmgLxHEv-0-319563043014bd78abd873ed44c6f832)
关键部分解析。
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=1739286998-ttYQJcXjQPJpFx8YdGREVMEQ5VT2gzvE-0-84cce36071d819ad9a8363d769567a26)
使用mysqlbinlog解析如下。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_64.jpg?sign=1739286998-dTm2w5AmYjOyVrNZ8nobKBuVWgBPkwZg-0-7d4541a169a54dffb6e1730627ef550e)
下面是DELETE_EVENT:
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_65.jpg?sign=1739286998-c0FE1hg9bYl4QqWTBRG6YoCEVPgguugm-0-a15083d76491e43321373ac85080f8a0)
关键部分解析。
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节详细解释。