![深入理解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=1738924888-AezUqwEbLUg3QpapPMHt7SngDaP87NUK-0-195eb02c5725f5c4db2622da947e1a7a)
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_59.jpg?sign=1738924888-tQaWNt7EKcHYmzbLh1BoSkX8qDqDW6Qn-0-b4f14545dfdcedaaa43bb1c4e00e48b7)
执行如下语句。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_60.jpg?sign=1738924888-Qqnf7VI9YaTwctgxSmApWo4qmBalLKUj-0-78d5521f2431518cebab36bf3bd5e013)
使用mysqlbinlog解析,如下。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_61.jpg?sign=1738924888-9pCeW5fBntNVLpqqMMw9xa09cGlMAuUT-0-14fb04626030f39c63a0a2832e01813d)
下面是语句生成的DELETE_EVENT。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_62.jpg?sign=1738924888-hNkMVqYjf08zPYDaI0Q0IU1kfRwRZ0c3-0-4e1d660f470316d14b9da7f5d984397d)
关键部分解析。
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=1738924888-7QAfgryOgDhxBYPtq0PqRgGYy6VqpUF3-0-bb1cb3c7d08801a37f13e1f28a10e40a)
使用mysqlbinlog解析如下。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_64.jpg?sign=1738924888-rRF3AjHIls1PQJJoQAsrI5KJfM05Pigm-0-69be713a6f371dfaac1bbb9611815631)
下面是DELETE_EVENT:
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt002_65.jpg?sign=1738924888-U9tFJM1gtyOcX8jbmiAU5t9JX1yiDIqk-0-7154cbc13f21a0803aee9d7437a5d3c8)
关键部分解析。
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节详细解释。