InnoDB记录锁是否默认使用索引?附索引记录相关疑问
关于InnoDB记录锁的疑问解答
记录锁
记录锁是对索引记录(index record)的锁。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;会阻止其他事务插入、更新或删除t表中c1值为10的行。
记录锁始终锁定索引记录(index record),即使表未定义任何索引。这种情况下,InnoDB会创建一个隐藏的聚簇索引,并使用该索引进行记录锁定。
问题1:索引记录(index record)是否指该索引数据结构中的一个“节点”?
是的,完全可以这么理解。InnoDB的索引基于B+树结构,不管是聚簇索引还是二级索引,结构里的每个节点(包括叶子节点和非叶子节点)都对应一条索引记录:
- 聚簇索引的叶子节点记录直接包含整行数据;
- 二级索引的叶子节点记录包含索引列的值,以及指向聚簇索引的主键指针。
InnoDB施加记录锁时,本质就是锁定索引结构里的对应节点,通过它关联到实际的数据行。
问题2:记录锁是否默认使用索引来提升性能?
没错,InnoDB依赖索引实现高效的记录锁,核心原因有两点:
- 精准定位:通过索引能快速找到需要锁定的行,避免全表扫描式锁定,大幅降低锁的范围和开销;
- 细粒度控制:借助索引结构,InnoDB可以实现精准的行级锁,而非锁定整张表。就算表没有显式创建索引,InnoDB也会自动生成隐藏的聚簇索引(优先用主键,无主键则用唯一非空索引,都没有则生成内部row_id),本质还是通过索引完成记录锁定,确保锁的效率。
内容的提问来源于stack exchange,提问作者user19481364
相关产品推荐
相关产品推荐

