InnoDB是如何存儲數據的?
InnoDB 的數據是按「數據頁」為單位來讀寫的,默認數據頁大小為 16 KB。每個數據頁之間通過雙向鏈表的形式組織起來,物理上不連續,但是邏輯上連續。
數據頁內包含用戶記錄,每個記錄之間用單向鏈表的方式組織起來,為了加快在數據頁內高效查詢記錄,設計了一個頁目錄,頁目錄存儲各個槽(分組),且主鍵值是有序的,于是可以通過二分查找法的方式進行檢索從而提高效率。
為了高效查詢記錄所在的數據頁,InnoDB 采用 b+ 樹作為索引,每個節點都是一個數據頁。
如果葉子節點存儲的是實際數據的就是聚簇索引,一個表只能有一個聚簇索引;如果葉子節點存儲的不是實際數據,而是主鍵值則就是二級索引,一個表中可以有多個二級索引。
在使用二級索引進行查找數據時,如果查詢的數據能在二級索引找到,那么就是「索引覆蓋」操作,如果查詢的數據不在二級索引里,就需要先在二級索引找到主鍵值,需要去聚簇索引中獲得數據行,這個過程就叫作「回表」。
間隙鎖的工作原理
間隙鎖,只存在于可重復讀隔離級別,目的是為了解決可重復讀隔離級別下幻讀的現象。
假設,表中有一個范圍 id 為(3,5)間隙鎖,那么其他事務就無法插入 id = 4 這條記錄了,這樣就有效的防止幻讀現象的發生。
心靈拷問:MySQL 到底是怎么加行級鎖、間隙鎖、臨鍵鎖的?_間隙鎖怎么加-CSDN博客
Mysql的undolog redolog是干什么的
undolog和redolog都是在InnoDB引擎下才有的日志
undolog保證事務的原子性,有一個undolog版本鏈保存歷史版本,可以進行回滾,這也在MVCC里面有所應用,MVCC就是基于readview決定快照讀的時候去返回哪一個版本的數據
redolog主要有兩份,在磁盤中有一份,在內存中也有一份,