繁体   English   中英

InnoDB Locking - 记录锁是否使用索引?

[英]InnoDB Locking - Does record lock use indexes?

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 节,“聚簇索引和二级索引”。

索引是一种数据结构(在幕后它看起来像一个小表,其中每条记录包含一个带有原始记录主键的列,另一列包含原始记录在原始表中所在的页面以及其他列)据我了解,

所以索引记录是指该索引的“节点”,它是一种数据结构?

那么,您的意思是记录锁“默认”使用索引来提供更多性能?

我想,要理解这句话,您需要知道 InnoDB总是将表数据存储在 b 树中,例如在索引中,请参阅Clustered and Secondary Indexes

每个 InnoDB 表都有一个特殊的索引,称为聚集索引,用于存储行数据

[...]

如果表没有 PRIMARY KEY 或合适的 UNIQUE 索引,InnoDB 会在包含行 ID 值的合成列上生成一个名为 GEN_CLUST_INDEX 的隐藏聚集索引。

所以这个索引无论如何都存在,对于这种情况,InnoDB 创建一个隐藏的聚集索引并使用这个索引进行记录锁定,这意味着创建索引只是为了锁定,可能会让你有点偏离轨道。

所以回答你的问题:MySQL 不锁定索引而不是记录,因为它会提供更多的性能,但因为“锁定记录”和“锁定聚集索引中的条目”是等效的。

此外,MySQL 可以而且也会在二级索引上加锁。 这些是您的数据结构,通过提供主键(或 GEN_CLUST_INDEX)指向原始表中的记录。 但请注意,这不需要“原始记录所在的页面”(对于 InnoDB)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM