關於聚簇索引的個人理解


首先我們要明白:聚簇索引是基於B+樹結構而產生的,整個樹中都是以頁為單位進行分級、存儲的而且只能是搜索條件為主鍵值時才可能發揮作用。

 

mysql中innodb存儲引擎的B+樹的結構是什么樣子的?

B+樹主要包括:葉子節點、非葉子節點。

葉子節點:是整個B+樹最底層的,葉子節點中存儲的是用戶的真實記錄信息和一些行信息及頁信息。

非葉子節點:是葉子節點往上的所有節點,包括目錄項、根節點等。目錄項和葉子節點類似只不過目錄項中存儲的是目錄項記錄(包括頁號、頁中最小主鍵ID)它也是采用用戶記錄存儲的方式來進行存儲的而目錄項和目錄項是通過雙向鏈表組織起來的。

如果當前B+樹有四層(一般不會超過四層)。假設B+樹中的所有節點都可以存儲1000條記錄則意味着可以存儲1000的4次方條記錄。

 

mysql中innodb存儲引擎的B+樹有哪些特點?

使用記錄主鍵的大小進行記錄和頁的排序:

1.頁內的記錄是通過主鍵的大小順序排成的一個單向鏈表。

2.各個存放用戶記錄的頁(目錄項)也是根據頁中的記錄的主鍵大小順序排成一個雙向鏈表的。

3.各個存放目錄項的頁也是根據頁中記錄的主鍵大小順序排成一個雙向鏈表的。

 

以此處為分界線在innodb引擎中滿足以上所有條件的B+樹我們就稱其為聚簇索引,這種聚簇索引innodb引擎會自動創建。在innodb引擎中聚簇索引就是一種存儲方式(所有的用戶記錄都會存儲在葉子節點中)也就是我們常說的索引即數據。

 

聚簇索引有什么優缺點?

優點:根據主鍵值即可獲取用戶的真實記錄信息因為這些數據時保存在主鍵節點下的且無需回表。

缺點:如果碰到不規則的主鍵數據插入或者一些寫操作時會造成的行遷移頁分裂,當發生行遷移和頁分裂時從底層的葉子到各層的非葉子節點都會發生改變這樣的操作開銷是很大的。

 

查找的時候會發什么?

在聚簇索引中查找記錄時只要符合索引的使用規則即可。它會先訪問根節點然后根據二分法判斷該去哪個目錄項中去查找,然后在目錄項中繼續使用二分法定位到具體的數據頁中接着繼續用二分法在具體數據頁中找到數據所在的具體的槽號並返回信息,這里也可能出現數據不存在的請。

 

編輯數據時會發生什么?

在聚簇索引編輯數據的時候會根據具體的sql語句來調整各層級內的頁中的信息,例如行遷移頁的拆分等等。所以聚簇索引在編輯操作時維護成本是比較高的。

 

此處單獨提一下myisma引擎中的索引,它和二級索引很像但是它的葉子節點存儲的是索引值和內存地址和innodb中的索引還有有些不同的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM