先上结论
主键索引 | 唯一索引 | 普通索引 | 普通字段 | |
等值查询 | 行锁 | 行锁 | 行锁 | 间隙锁,锁表 |
范围查询 | 间隙锁,锁范围行 | 间隙锁,锁范围行 | 间隙锁,锁范围行 | 间隙锁,锁表 |
数据表准备
DROP TABLE IF EXISTS `t_user_test`;
CREATE TABLE `t_user_test` (
`id` int NOT NULL,
`user_id` int NULL DEFAULT NULL,
`user_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
`city` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `idx_uid`(`user_id`) USING BTREE COMMENT '用户ID唯一索引',
INDEX `idx_uname`(`user_name`) USING BTREE COMMENT '用户姓名普通索引'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
insert into t_user_test VALUES(1,1001,'张三','深圳'),
(2,1005,'李四','惠州'),
(3,1009,'王五','佛山'),
(4,1020,'赵六','珠海');
id :主键
user_id : 唯一索引
user_name: 普通索引
city: 无索引,普通字段
Session1 Session2 关闭自动提交
主键等值查询 命中
等值查询,主键ID命中,锁住行
主键等值查询 不命中
等值查询,主键ID不命中,没有行锁产生
唯一索引等值查询 命中
等值查询,唯一索引命中,锁住行
唯一索引等值查询 不命中
等值查询,唯一索引不命中,没有行锁产生
普通索引等值查询 命中
等值查询 普通索引命中,锁住行
普通索引等值查询 不命中
等值查询,普通索引不命中,没有行锁产生
非索引字段,等值查询命中
等值查询,非索引字段命中,产生表锁
5个 LOCK_MODE 为 X
,说明是 X 型的 next-key 锁;相当于锁住了整个表
非索引字段,等值查询 不命中
等值查询,非索引字段不命中,产生表锁
在范围查询之前,先insert一条数据
insert into t_user_test values(8,1002,'秦七','东莞');
主键范围查询 命中
范围查询,主键字段命中,间隙锁,锁住大于1的记录
主键范围查询 不命中
范围查询,主键字段不命中,间隙锁,锁住大于9的记录
唯一索引范围查询 命中
范围查询,唯一索引字段命中,间隙锁 同主键ID一致 锁住条件内的
唯一索引范围查询 不命中
范围查询,唯一索引字段不命中,间隙锁,同主键ID一致 锁住条件内的
普通索引范围查询 命中
同主键,唯一索引一致 间隙锁
普通索引范围查询 不命中
同主键,唯一索引一致 间隙锁