簡體   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