MySQL更新非索引列的语句会锁全表吗?
关于UPDATE语句锁范围的说明
嘿,这个问题得结合你用的数据库引擎来具体分析,我分两种最常见的情况给你拆解:
1. 如果你用的是InnoDB(MySQL主流事务引擎)
InnoDB本身支持行级锁,但行锁的生效依赖于能通过索引快速定位目标行。你这条语句的WHERE bank_name='null',如果bank_name字段没建索引的话,InnoDB会被迫做全表扫描——它会逐行检查每条记录是否符合条件,对符合条件的行加排他锁(X锁)。要注意:扫描过程中,哪怕是不符合条件的行,InnoDB也会先加锁再判断,确认不符合后才释放锁。对你这张百万级的表来说,全表扫描期间几乎整张表的行都会被短暂或持续锁定,直到UPDATE事务完成,实际效果和锁整张表差别不大,其他事务要修改这张表的任何记录都会被阻塞。
要是bank_name有索引,那InnoDB就能通过索引直接定位到所有bank_name='null'的行,只会给这些符合条件的行加行锁,完全不会影响其他行。
2. 如果你用的是MyISAM(MySQL的非事务引擎)
MyISAM本身只支持表级锁,不管你的WHERE条件有没有索引,执行这条UPDATE语句时都会直接锁定整张表,直到语句执行完成。这期间其他读写操作(比如SELECT、INSERT、UPDATE)都会被阻塞。
另外补充下:你提到不在意耗时,但锁范围会直接影响并发性能——如果是表锁或者近似表锁的情况,语句执行期间这张表的其他操作都会被卡住,这点可以留意下。
内容的提问来源于stack exchange,提问作者Sridhar DD
相关产品推荐
相关产品推荐

