为什么mysql表字段不宜过多,由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法...

由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法

binlog_format为row格式的时候记录的不是简单的sql,而是实际变更的行,一些大的DML操作,会导致binlog量增加很大,消耗额外的IO、网络资源可以通过设置binlog_row_p_w_picpath=minimal解决测试:

binlog_row_p_w_picpath默认值是full

de0e51be6675c6e5ef903f3253b704e2.png

对user表进行update

98515075d180aa881e67c5a317e58df8.png

进入binlog里面查看更新记录,binlog日志将所有影响的行都进行了记录

fa452805013de13f4149ad995f8e7168.png

现在将binlog_row_p_w_picpath=minimal

56554294ba99b599b9d55bdcf4571563.png

对表中的行进行相同的update操作 再来观察下binlog记录

445f749d1515b251bfa4182037c29574.png

结论:可以对比发现当binlog_row_p_w_picpath=minimal的时候binlog只记录了影响的那一行记录,有效减少了binlog日志量。

数据库版本:5.6.*

1.row日志p_w_picpath类型

参数该参数还有两种,minimal和noblob,minimal表示只记录after更改后的值,并且如果有主键或者非空唯一索引,则只以该字段作为where条件判断;noblob同full,只是不记录blob、text列。

2.binlog日志

对于insert则没有什么好说的,我们主要重点关注一下update和delete操作。

--建表语句

CREATE TABLE`pk_test`(

`id`bigint(20)NOT NULL,

`username`varchar(30)NOT NULL,

PRIMARY KEY(`id`)

)ENGINE=InnoDBDEFAULT CHARSET=utf8;

insertintopk_test values(1,2);

insertintopk_test values(2,2);

commit;

show master statusG;--记录binlog文件和pos

deletefrompk_testwhereid=1;

update pk_testsetusername='3';

commit;

mysqlbinlog--no-defaults-v--start-position=637945822/mysqllog/3307/binlog/mysql-bin.000001|more

### DELETE FROM `baofeng`.`pk_test`

### WHERE

### @1=1

### @2='2'

.....

### UPDATE `baofeng`.`pk_test`

### WHERE

### @1=2

### @2='2'

### SET

### @1=2

### @2='3'

从上面我们可以看到,在默认为FULL的binlog_row_p_w_picpath下,无论表有没有主键、唯一索引,全部按照全表字段作为条件,且update会更新全部字段。

binlog_row_p_w_picpath=minimal的情况下:--建表语句

CREATE TABLE`ui_test`(

`id`bigint(20)NOT NULL,

`username`varchar(30)NOT NULL,

UNIQUE(`id`)

)ENGINE=InnoDBDEFAULT CHARSET=utf8;

CREATE TABLE`ui_test_null`(

`id`bigint(20),

`username`varchar(30)NOT NULL,

UNIQUE key(`id`)

)ENGINE=InnoDBDEFAULT CHARSET=utf8;

CREATE TABLE`null_test`(

`id`bigint(20),

`username`varchar(30)NOT NULL

)ENGINE=InnoDBDEFAULT CHARSET=utf8;

insertintopk_test values(1,2);

insertintoui_test values(1,2);

insertintoui_test_null values(1,2);

insertintonull_test values(1,2);

commit;

update pk_testsetusername='4';

deletefrompk_test;

deletefromui_test;

deletefromui_test_null;

update null_testsetusername='4';

deletefromnull_test;

### UPDATE `baofeng`.`pk_test`

### WHERE

### @1=1

### SET

### @2='4'

....

### DELETE FROM `baofeng`.`pk_test`

### WHERE

### @1=1

.....

### DELETE FROM `baofeng`.`ui_test`

### WHERE

### @1=1

.....

### DELETE FROM `baofeng`.`ui_test_null`

### WHERE

### @1=1

### @2='2'

.....

### UPDATE `baofeng`.`null_test`

### WHERE

### @1=1

### @2='2'

### SET

### @2='4'

.....

### DELETE FROM `baofeng`.`null_test`

### WHERE

### @1=1

### @2='2'

从上面的例子可以看到,当binlog_row_p_w_picpath=minimal的情况下,where条件只有主键或不为空的唯一索引,且只会更新被改变的字段。

3.总结:

在上面的测试我们可以看到,如果采用minimal格式,将减少主键和非空唯一索引表的before值,以及减少所有表update的after未被改变的值。从效率上来说,减少了网络传输以及加快了update的效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值