更新數據時,MySQL的聚簇索引是如何變化的?

文章已收錄在我的 GitHub 倉庫,歡迎Star/fork: Java-Interview-Tutorial 聽說點贊、評論、收藏的人長得都很好看哦。

搜索一個主鍵id對應的行,先去頂層的索引頁88裏通過二分查找,定位到你應該去下層哪個索引頁裏繼續找。

若現在定位到下層的索引頁35,此時在索引頁35裏也有一些索引條目,分別都是下層各索引頁(20、28、59)及他們裏面最小的主鍵值,此時在索引頁35的索引條目裏繼續二分查找,容易定位到,應該再到下層的索引頁裏找。

可能從索引頁35接着就找到下層的索引頁59,此時索引頁59裏也有索引條目,存放部分數據頁頁號(如數據頁2、8)和每個數據頁裏最小的主鍵值。在此繼續二分查找,就能定位到應該到哪個數據頁裏去找。

比如進入數據頁2,裏面就有個頁目錄,存放各行數據的主鍵值和行的實際物理位置。在此繼續二分查找,即可快速定位到待搜索主鍵值對應行的物理位置,然後直接在數據頁2裏找到那條數據。這就是基於索引去查找主鍵的過程。

最下層的索引頁,都有指針引用數據頁,所以索引頁之間跟數據頁之間有指針連接。索引頁內部,同一層級的索引頁互相之間也是基於指針組成雙向鏈表:

假設你把索引頁和數據頁綜合起來看,他們都是連接在一起的,從根索引頁88開始,一直到所有的數據頁,組成了B+樹。最底層的一層就是數據頁,數據頁也就是B+樹裏的葉節點。

所以,如果B+樹索引數據結構裏,葉節點就是數據頁自己本身,即爲聚簇索引!即上圖中所有的索引頁+數據頁組成的B+樹就是聚簇索引!

InnoDB下,對數據增刪改時,就是直接把你的數據頁放在聚簇索引,數據就在聚簇索引裏,聚簇索引就包含了數據。比如你插入數據,那就是在數據頁裏插入數據。

若你的數據頁開始進行頁分裂,他此時會調整各數據頁內部的行數據,保證數據頁內的主鍵值都有序,:

下一個數據頁的所有主鍵值>上一個數據頁的所有主鍵值

頁分裂時,也會維護你的上層索引數據結構,在上層索引頁裏維護你的索引條目,不同的數據頁和最小主鍵值。

然後若你的數據頁越來越多,一個索引頁放不下了,就會再拉出新的索引頁,同時再搞一個上層的索引頁,上層索引頁裏存放的索引條目就是下層索引頁頁號和最下主鍵值。

同理可得,若你的數據量越大,此時可能就多出更多索引頁層級,不過一般索引頁裏可以放很多索引條目,即使你是億級大表,基本上大表裏建的索引的層級也就三四層。

聚簇索引默認按主鍵組織的,所以你在增刪改數據時:

  • 會更新數據頁

  • 會給你自動維護B+樹結構的聚簇索引,給新增和更新索引頁,這個聚簇索引是默認就會給你建立

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章