对一张宽表只改一个窄列,对比binlog_row_image设成FULL和MINIMAL时,真实的binlog事件大小差多少。
代码CREATE TABLE wide_row (id INT PRIMARY KEY, a VARCHAR(200), b VARCHAR(200), c VARCHAR(200), d VARCHAR(200), e INT); INSERT INTO wide_row VALUES (1, REPEAT('a',200), REPEAT('b',200), REPEAT('c',200), REPEAT('d',200), 100); -- 只改e这一个int列 UPDATE wide_row SET e = 200 WHERE id=1;
# at 429 end_log_pos 2099 Update_rows: table id 91 ... 真实事件大小:2099 - 429 = 1670 字节
虽然这条UPDATE真实只改了e这一个int列,FULL模式下binlog真实还是把改动前后完整的一整行都记录了下来——包括那4个各200字节、内容压根没变的VARCHAR列,真实占用了1670字节。
代码SET GLOBAL binlog_row_image = 'MINIMAL'; -- 新连接生效后,同样跑一次UPDATE wide_row SET e = 300 WHERE id=1;
# at 429 end_log_pos 475 Update_rows: table id 91 ... 真实事件大小:475 - 429 = 46 字节 ← 真实缩小了约36倍
每一步都是本文上面用真实mysqlbinlog测量跑出来的原始结果。
binlog_row_image(FULL/MINIMAL/NOBLOB) + mysqlbinlog真实测量事件大小