mysql分区情况下,如何对历史数据更新而不引起表锁

由于业务需要增加字段并对历史数据进行更新,但更新旧数据的操作不能引起锁表行为。如果采用索引方式,一般是会引起行锁,影响不大,但是如果update条件中不包含索引,则会引起锁表。下面看下表分区后对于锁的特点。

1.建表语句,按时间分月进行分区(to_days函数得到是从0年开始到现在的天数)

CREATE table a (
 id BIGINT(20) not null  auto_increment,
 version SMALLINT(6),
 ctime datetime,
PRIMARY KEY (id,ctime) using BTREE
) ENGINE=INNODB
PARTITION by RANGE (TO_DAYS(ctime))
(PARTITION p201904 VALUES  less than (737545) ENGINE=INNODB,
PARTITION p201905 VALUES  less than (737576) ENGINE=INNODB);
INSERT INTO `a` (`version`, `ctime`) VALUES (1, '2019-4-10 11:47:29');
INSERT INTO `a` (`version`, `ctime`) VALUES (2, '2019-4-19 14:40:25');
INSERT INTO `a` (`version`, `ctime`) VALUES (3, '2019-5-23 11:47:39');
INSERT INTO `a` (`version`, `ctime`) VALUES (4, '2019-5-23 14:40:41');

2.测试情况1:按照分区条件更新

打开两个命令窗口进行测试,测试语句如下,窗口1输入update语句先不commit,窗口2进行update并commit成功,说明没有产生锁表

3.测试情况2:直接指定更新某个区

打开两个命令窗口进行测试,测试语句如下,窗口1输入update语句先不commit,窗口2进行update并commit成功,说明没有产生锁表

 

结论:当查询条件命中分区或者直接指定分区进行更新时,不会引起表锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值