回答
是的,Update 语句 where 条件字段没加索引会锁全表。详细过程如下:
1、InnoDB 引擎支持行锁,当隔离级别为可重复读时,即 InnoDB 默认的事务隔离级别,**其加锁的基本单位是 next-key 锁(记录锁 + 间隙锁)。**next-key lock 会锁住记录本身和记录之间的“间隙”,防止其他事务在这个记录区间插入新的记录,从而避免幻读现象。
2、InnoDB 间隙锁是在索引上而非行上。
3、where 条件字段没有使用索引,那么会全表扫描。相应的会对所有的记录加上 next-key 锁(gap lock + record lock),相当于把整个表锁住。
扩展
一、数据准备
CREATE TABLE `t_user` (
`id` int NOT NULL,
`age` int NOT NULL,
`name` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB;
insert into t_user(id,age,name) values (1, 10, 'ab');
insert into t_user(id,age,name) values (6, 20, 'f');
insert into t_user(id,age,name) values (25, 25, 'ee');
insert into t_user(id,age,name) values (100, 100, 'ff');
insert into t_user(id,age,name) values (200, 200, 'gg');