mysql批量更新千万数据思路 mysql批量更新数据
我们在数据库执行update语句的时候,到底是锁表还是锁行?这里直接用MySQL上例子测试下 。
一、环境准备1、新建一个表create table test_update(id BIGINTnot 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');二、开始测试场景一:不加索引
开启事务【mysql批量更新千万数据思路 mysql批量更新数据】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语句锁表 。
推荐阅读
- ipad怎么更新ios系统
- 域名解析ip批量查询 根据域名查ip地址
- win系统关闭自动更新了解 win系统关闭自动更新
- mysql安装教程分享 mysql的安装包在哪个文件
- 微信怎么批量删除不是好友的人
- 苹果ipad型号对照表 ios9.3.2无法更新
- ibeta me屏蔽更新在哪
- 适合冬天的睡前晚安文案
- mysql性能监控工具和调优 mysql工具有哪些
- 林更新买房是什么梗
