mysql批量更新数据(mysql批量更新千万数据思路)

我们在数据库执行update语句的时候,到底是锁表还是锁行?这里直接用MySQL上例子测试下。 一、环境准备 1、新建一个表 createtabletest_update( idBIGINTnotnullprimarykeyCOMMENT'主键ID,雪花算法生成', nameVARCHAR(100)COMMENT'姓名', user_noVARCHAR(20)COMMENT'用户编号' ); 2、…

我们在数据库执行update语句的时候,到底是锁表还是锁行?这里直接用MySQL上例子测试下。

一、环境准备

1、新建一个表

create table test_update(
   id BIGINT  not null primary key COMMENT \'主键ID,雪花算法生成\',
   name VARCHAR(100) COMMENT \'姓名\',
   user_no VARCHAR(20) COMMENT \'用户编号\'
);

2、插入两条数据

insert into test_update(id,name,user_no)values(1,\'张三\',\'001\');
insert into test_update(id,name,user_no)values(2,\'李四\',\'002\');

二、开始测试

场景一:不加索引

开启事务
sql1:update test_update set name=’张三1’ where user_no in(‘001’);
不提交事务


开启事务
sql2:update test_update set name=’李四1’ where user_no in(‘002’);
提交事务

我们发现在sql1不提交事务的情况下,sql2被阻塞了,只有当sql1的事务提交后sql2才会执行成功。

总结:在不加索引的情况下,update语句锁表。

场景二:加索引

先在user_no加索引
ALTER TABLE test_update ADD INDEX index_name (user_no);


开启事务
sql1:update test_update set name=’张三1’ where user_no in(‘001’);
不提交事务


开启事务
sql2:update test_update set name=’李四1’ where user_no in(‘002’);
提交事务

我们发现在sql1不提交事务的情况下,sql2也执行成功了,也就是sql2不依赖于sql1的事务提交。

总结:在加索引的情况下,update语句锁行。

场景三:加索引,但是in里面是复杂查询

上面的例子in里面都是确定的值,加入in里面是查询出来的呢,如下例子(user_no已经加上索引)

开启事务
sql1:update test_update set name=’张三1’ where user_no in(select user_no from other_table where id=1);
不提交事务


开启事务
sql2:update test_update set name=’李四1’ where user_no in(select user_no from other_table where id=2);
提交事务

我们发现在sql1不提交事务的情况下,sql2被阻塞了,只有当sql1的事务提交后sql2才会执行成功,跟场景一结果一样。

总结:在加索引的情况下,in里面是不确定的值,update语句锁表。

本文来自投稿,不代表来拓客立场,如若转载,请注明出处:https://www.laituoke.com/ltk/31218.html