MySql B+樹索引-個人記錄,不喜勿噴

MySql Innodb索引:

  • B+樹
  • 全文索引
  • 哈希索引

 

B+樹

  • 有n個子樹的中間節點包含n個元素,每個元素不保存數據,只用來索引,所有數據都保存在葉子節點。
  • 所有葉子節點包含元素的信息以及指向記錄的指針,且葉子節點按關鍵字自小到大順序鏈接。
  • 所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。

所有的數據都在葉子節點,且每一個葉子節點都帶有指向下一個節點的指針,形成了一個有序的鏈表。

 一般性情況,數據庫的B+樹的高度一般在2~4層,這就是說找到某一鍵值的行記錄最多需要2到4次邏輯IO,相當於0.02到0.04s。
 

 

B樹和B+樹的區別:

  • B+樹所有的數據都在葉子節點上,非葉子節點只保存索引;B樹葉子節點和非葉子節點都保存索引和數據;同樣的空間,B+樹能存儲更多的索引,它比B樹更胖更矮,查詢時減少IO次數
  • 查詢的時候,B樹的數據分佈在各個節點及子節點,每次查詢的深度不一樣,也就是說不穩定;B+數據所有的數據都在葉子節點,每次查詢時最終必須到葉子節點,深度是一樣的,比較穩定
  • 範圍查詢,B+樹的數據都是在葉子節點的鏈表結構,查詢更方便
  •  

問:一張表有多個普通索引,它的存儲結構是什麼,如何查找數據

一張表有多個索引就有多個B+樹;

二級索引的葉子節點包含的用戶記錄由索引列 + 主鍵組成,所以如果想通過二級索引來查找完整的用戶記錄的話,需要通過回表操作,也就是在通過二級索引找到主鍵值之後再到聚簇索引中查找完整的用戶記錄

InnoDB存儲引擎會自動爲主鍵(如果沒有它會自動幫我們添加)建立聚簇索引,聚簇索引的葉子節點包含完整的用戶記錄

B+樹中每層節點都是按照索引列值從小到大的順序排序而組成了雙向鏈表,而且每個頁內的記錄(不論是用戶記錄還是目錄項記錄)都是按照索引列的值從小到大的順序而形成了一個單鏈表。如果是聯合索引的話,則頁面和記錄先按照聯合索引前邊的列排序,如果該列值相同,再按照聯合索引後邊的列排序

通過索引查找記錄是從B+樹的根節點開始,一層一層向下搜索。由於每個頁面都按照索引列的值建立了Page Directory(頁目錄),所以在這些頁面中的查找非常快

說人話就是在二級索引裏找到主鍵值,去主鍵的聚簇索引中根據主鍵值找到真正的記錄

二級索引搜索: 二級索引樹---->葉子節點值(主鍵值)----->主鍵索引樹----->葉子節點值(最終數據值)

 

聚簇索引

       以innodb爲例,在一個數據table中,它的數據文件和索引文件是同一個文件。即在查詢過程中,找到了索引,便找到了數據文件。在innodb中,即存儲主鍵索引值,又存儲行數據,稱之爲聚簇索引

        innodb索引,指向主鍵對數據的引用。非主鍵索引則指向對主鍵的引用。innodb中,沒有主見索引,則會使用unique索引,沒有unique索引,則會使用數據庫內部的一個行的id來當作主鍵索引。

 

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