索引的原理——我們爲什麼用B+樹來做索引?

什麼是索引?

索引是關係數據庫中對某一列或多個列的值進行預排序的數據結構,就好比書籍的目錄。

爲什麼使用索引?

索引的出現其實就是爲了提高數據庫查詢的效率,就好比書的目錄,通過書的目錄,我們可以快速精確找到我們想要的信息

不適合索引的數據結構

索引的作用是爲了提高查詢的效率,而可以提高查詢的數據結構有很多種,我們都知道數據庫選擇了B+樹這一數據模型作爲索引的數據結構,那麼爲什麼選擇B+樹,而不是其他數據結構?

數組

如果單從查詢效率來看,數組顯然是最合適的,我們都知道數組的查詢速度快,但是當我們的數據庫中存在數據更新時,假如在中間插入一個數據,那麼後面的全部數據都要移動,顯然數組結構比較適合靜態數據不變的存儲

二叉樹

由二分查找思想,二叉樹也是經典的提高查詢速度的數據結構,但是爲什麼不選擇二叉樹是因爲,索引的存儲位置原因,這裏首先問一下,索引存儲在哪裏?
索引存儲在磁盤當中,首先要知道索引要加載到內存中才能查詢,而從磁盤到內存的加載過程就會有磁盤I/O過程,數據查詢的主要時間就是磁盤I/O的時間,我們簡單理解就是I/O過程非常消耗時間,我們需要做的就是儘量減少I/O的過程,這裏我們舉個例子。假設一個7個節點的二叉樹它可以是三層高,也同樣可以是7層高,二叉樹高度不好控不行,那麼平衡二叉樹那,我們認爲的添加限定條件,限制樹的高度,但是假如N比較大二叉樹依然很高,所以我們換一種思路M叉樹,也就是B樹和B+樹

B-樹

B-樹是一種平衡的多路查找樹。B樹結構如下圖所示
B樹結構
B樹每個結點最多有M棵子樹,M就是B樹的階,一棵M階的B樹滿足下面的特性:

  1. 樹中每個節點最多有M棵子樹
  2. 若根節點不是葉子結點,則最少有兩棵子樹
  3. 除根節點外的所有非終端結點,也就是中間結點,子樹在[ceil(M/2),M]之間,就是有最大最小值約束
  4. 所有非終端結點(葉子結點)也就是中間結點,包含三種信息(關鍵字,子樹,指針),假設一箇中間結點,包含K個關鍵字,則子樹數目爲k+1,也就是說關鍵字和子樹數目存在加一的關係
  5. 假設中間節點節點的關鍵字爲:Key[1], Key[2], …, Key[k-1],且關鍵字按照升序排序,即 Key[i]<Key[i+1]。此時 k-1 個關鍵字相當於劃分了 k 個範圍,也就是對應着 k個指針,即爲:P[1], P[2], …, P[k],其中 P[1] 指向關鍵字小於 Key[1] 的子樹,P[i] 指向關鍵字屬於 (Key[i-1], Key[i]) 的子樹,P[k] 指向關鍵字大於 Key[k-1] 的子樹
  6. 所有葉子結點出現在同一個層次

B+樹

B+樹是基於B-樹做的改進,兩者差異在於:

  1. 有 k 個孩子的節點就有 k 個關鍵字。也就是孩子數量 = 關鍵字數,而 B 樹中,孩子數量 = 關鍵字數 +1。
  2. 非葉子節點的關鍵字也會同時存在在子節點中,並且是在子節點中所有關鍵字的最大(或最小)。
  3. 非葉子節點僅用於索引,不保存數據記錄,跟記錄有關的信息都放在葉子節點中。而B樹中,非葉子節點既保存索引,也保存數據記錄。
  4. 所有關鍵字都在葉子節點出現,葉子節點構成一個有序鏈表,而且葉子節點本身按照關
    鍵字的大小從小到大順序鏈接。下圖就是一棵 B+ 樹,階數爲 3,根節點中的關鍵字 1、18、35 分別是子節點(1,8,14),(18,24,31)和(35,41,53)中的最小值。每一層父節點的關鍵字都會出現在下一層的子節點的關鍵字中,因此在葉子節點中包括了所有的關鍵字信息,並且每一個葉子節點都有一個指向下一個節點的指針,這樣就形成了一個鏈表。
    在這裏插入圖片描述
    在B樹和B+樹兩者之間,我們爲什麼選擇B+樹了那,因爲局部性原理和磁盤預讀的特性,這兩個概念讀者可以自行百度一下,是計算機系統的特性,計算機讀取數據是以頁爲單位的,大小爲4K,所以說我們每次讀取磁盤塊大小固定的,如果我們在上層不僅存儲關鍵字還存儲數據,那麼就導致我們雖然可以有多個關鍵字指代多個子樹,但是我們空間不夠,導致我們依然存不了幾個子樹數據。
    總結一下就是,首先B+ 樹查詢效率更穩定。因爲 B+ 樹每次只有訪問到葉子節點才能找到對應的數據,而在 B 樹中,非葉子節點也會存儲數據,這樣就會造成查詢效率不穩定的情況,有時候訪問到了非葉子節點就可以找到關鍵字,而有時需要訪問到葉子節點才能找到關鍵字。
    其次,B+ 樹的查詢效率更高,這是因爲通常 B+ 樹比 B 樹更矮胖(階數更大,深度更低),查詢所需要的磁盤 I/O 也會更少。同樣的磁盤頁大小,B+ 樹可以存儲更多的節點關鍵字。
    不僅是對單個關鍵字的查詢上,在查詢範圍上,B+ 樹的效率也比 B 樹高。這是因爲所有關鍵字都出現在 B+ 樹的葉子節點中,並通過有序鏈表進行了鏈接。而在 B 樹中則需要通過中序遍歷才能完成查詢範圍的查找,效率要低很多。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章