MySQL二級索引MVCC
了解MVCC原理前,需要對InnoDB存儲引擎的運作方式有一定的理解。InnoDB的存儲方式是將數據以頁(page)為單位進行存儲。在一個頁的大小中,通常包含若干行數據。其中,每一行數據的存儲格式是按照定義的表結構進行存儲的。
由于InnoDB存儲引擎的實現機制,每個頁的存儲方式與記錄格式非常相關。頁最小存儲單位是16KB,因此每頁包含行數可能不同,每行記錄的大小也可能不同。
MySQL的二級索引采用了MVCC機制來解決并發訪問時的競爭問題。MVCC的全稱是Multi-Version Concurrency Control,即多版本并發控制。在MVCC機制下,每個事務可以看到數據庫中的數據的一個快照,而不是當前最新的數據。這就可以避免多個事務并發訪問同一數據時的鎖等待問題。
在MySQL二級索引中,每個行記錄都維護了一個刪除標記(delete-mark)字段,用于保存該行記錄是否已被刪除。在進行查詢時,InnoDB會自動過濾已被刪除的行記錄,從而保證查詢結果的正確性。
值得注意的是,MVCC是一種基于快照的并發控制機制。當某個事務查詢一個數據庫時,InnoDB會自動生成該事務的一個快照,并在實際讀取數據時返回快照版本的數據。如果需要進行刪除、更新等操作,則需要生成新的快照,并將這些操作應用于新的快照。這樣,其他事務仍可以訪問舊的快照,不會對當前事務造成干擾。