mysql InnoDB锁定-记录锁定使用索引吗?

wqsoz72f  于 2023-01-01  发布在  Mysql
关注(0)|答案(1)|浏览(144)

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-intention-locks

记录锁

记录锁是对索引记录的锁。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;防止任何其他事务插入、更新或删除t.c1值为10的行。
记录锁总是锁定索引记录,即使表没有定义索引。对于这种情况,InnoDB会创建一个隐藏的聚集索引,并使用此索引进行记录锁定。请参见15.6.2.1“聚集索引和辅助索引”一节。
索引是一种数据结构(在幕后它看起来像一个小表,每个记录都包含一个列,该列具有原始记录的主键,另一个列具有原始记录在原始表中所处的页面以及其他列)从我的理解来看,

因此索引记录引用该索引的“节点”,而该索引是一个数据结构?
那么,您的意思是记录锁定“默认”使用索引来提供更高的性能?

sbdsn5lh

sbdsn5lh1#

我想,要理解这句话,您需要知道InnoDB * 总是 * 在b树中存储表数据,例如在索引中,请参见Clustered and Secondary Indexes
每个InnoDB表都有一个特殊的索引,称为聚集索引**,用于存储行数据**。
[...]
如果表没有PRIMARY KEY或合适的UNIQUE索引,InnoDB会在包含行ID值的合成列上生成一个名为GEN_CLUST_INDEX的隐藏聚集索引。
所以这个索引无论如何都是存在的,并且 * 对于这种情况,InnoDB创建了一个隐藏的聚集索引,并使用这个索引进行记录锁定 *,这意味着创建索引只是为了锁定,可能会让您有点偏离轨道。
为了回答你的问题:MySQL不锁定索引 * 而不是记录 *,因为这样可以提供更好的性能,而是因为"锁定记录"和"锁定聚集索引中的条目"是等效的。
另外,MySQL可以也会在二级索引上设置锁,这些是通过提供主键(或GEN_CLUST_INDEX)指向原始表中的记录的数据结构,但请注意,这不需要"原始记录所在的页面"(对于InnoDB)。

相关问题