簡單分析數據庫索引的數據結構

一、運用二叉查找樹優化索引

首先需要知道什麼是二叉查找樹 二叉查找樹是每一個節點最多有兩個子樹的數結構 通常左邊的樹稱爲左子樹 右邊的樹稱爲右子樹
在這裏插入圖片描述
比如說這一棵樹 根結點爲5 那麼根結點的左子樹均小於5 根結點的右子樹均大於5
二叉查找樹用的是二分查找 複雜度爲O(logn) 其查詢效率是非常高的 但是會有缺點
就例如說上圖的樹 刪除2結點和6結點 然後插入11結點
在這裏插入圖片描述
這樣這顆二叉查找樹就變成了線性結構 查詢效率大大降低 複雜度爲O(n)
但有人會有疑問 爲什麼不利用樹的旋轉特性 來使這棵樹維持平衡二叉樹狀態呢 維持在O(logn)上
如果我們採用樹的旋轉型來維持平衡二叉樹 影響程序運行的瓶頸就在於磁盤IO 衆所周知 IO運行的效率是非常低的
每一層都會發射一次IO 當遇到樹的深度非常深的時候 那麼需要進行多次IO 這時候效率是及其低下的 甚至比全表掃描還要低 那麼就沒有必要使用這種方法了 我們就想辦法讓樹從高瘦變的矮胖 這時候就引入了B-Tree數據結構

二、B-Tree優化索引

B-Tree也就是我們常稱的B-樹 也叫平衡多路查找樹
首先來一個三階B-Tree瞧一瞧
在這裏插入圖片描述每一個存儲塊中主要包含了關鍵字和存儲孩子的指針 如下圖
在這裏插入圖片描述
最多能有幾個孩子 主要取決於存儲塊的容量以及數據庫的相關配置 通常情況下 m階樹中的m是非常大的
看完了B-Tree長啥樣 我們來了解下B-Tree的特徵

舉例 m階B-Tree
1、首先B-Tree的根節點至少包括兩個孩子
2、每個結點最多包含m個孩子 (m>=2)
3、除了根節點和葉子結點之外 每個結點至少包括 ceil(m/2)個孩子
4、葉子結點都位於同一層上
5、關鍵字的特徵(約束): 這裏我就用白話文講了 還能明白
	(1)、每一個存儲塊中的關鍵字都是按照 從小到大排序 
	(2)、關鍵字的個數都要比同一存儲塊中的孩子數量少一個 個數限制爲 ceil(m/2)-1<=x<=m-1
	(3)、非葉子結點的指針:P[1]指向關鍵字小於K[1]的子樹 P[M]指向關鍵字大於K[M-1]的子樹 其餘P[i]指向關鍵字屬於(K[i-1],K[i])的子樹

瞭解完B-Tree 來了解一下更好的樹 B±Tree

三、B±Tree優化索引

B+樹是B樹的升級版 定義基本和B樹是相同的 與B樹同理 我們先來看看B+樹長什麼樣子

在這裏插入圖片描述

看完這個 我們再來張B樹來對比一下
在這裏插入圖片描述

看了兩棵樹 那不同之處就清晰可見了吧

1、非葉子結點的指針與關鍵字的個數是相同的
2、非葉子結點的子樹指針P[i] 指向關鍵字[K[i],k[i+1]) 這裏要注意了 要看區間範圍 是左閉右開 爲什麼呢 具體看下面的第三條
3、非葉子結點只用來做索引 數據都保存在葉子結點中 這裏就明白第二條了吧
4、所有的葉子結點都有一個鏈指針指向下一個葉子結點 鏈接起來可以方便我們做範圍統計 橫向的跨指數做統計

綜上所述 是不是B+樹更加適合用來做存儲索引

答案是肯定的 因爲它是終極進化
下面就來說原因
1、B+樹的磁盤讀寫代價更低 B+樹內部並沒有指向關鍵字的指針 即沒有存儲數據 數據都存儲在葉子結點中
2、B+樹的查詢效率更加穩定 因爲葉子結點存儲的數據 要查詢數據必須要走一條從根節點到葉子結點的路 所有關鍵字查詢效率是相同的
3、B+樹更加有利於數據庫的掃描 B+樹只要遍歷葉子結點就行 可以利用葉子結點的鏈指針進行範圍查詢 

四、Hash索引也優化索引

在瞭解這個Hash索引之前 我們需要知道什麼Hash查找 就是通過Hash函數的運算只需要一次定位 就能找到所需的頭 Hash索引理論查詢效率高於B+樹索引
下面來看圖實際來了解一下Hash索引
在這裏插入圖片描述
就比如說需要查找Sandra Dee 先要通過Hash函數計算 找到頭 152的buckets 然後進入entries的鏈表 逐一查找即可
但是我們肯定有疑問 Hash索引的效率要快於B+樹 那麼爲什麼B+樹還是主流索引呢
這個問題肯定是因爲Hash索引有缺點所以沒有主流 下面就來了解下缺點

1、Hash索引僅能滿足 = 和 IN 不能進行範圍查詢 因爲Hash索引比較的是進行Hash運算後的Hash值 只能用於等值的過濾 不能進行範圍查詢
2、無法被用來避免數據的排序操作
3、不能利用部分索引鍵查詢(這個我有疑問 不理解 還望理解的評論一下 謝謝)
4、不能避免表掃描 Hash索引是通過Hash運算之後將運算結果的Hash值和所對應的行指針信息存儲到Buckets中的 不能通過Hash索引直接完成查詢 還是要通過訪問這個Buckets中的實際數據進行比較
5、遇到大量Hash值相等的情況後性能並不一定就會比B+樹效率高

五、BitMap來優化索引(神器)

BitMap也叫位圖索引
BitMap的使用情況是 當表中的某個字段只有幾種值的時候 比如說要表示性別 只有男女兩種情況 如果只是爲了在這個字段上實現高效的統計 那麼位圖索引是最佳的選擇 但是目標很少數據庫支持位圖索引 主流Oracle位圖索引
知道了用處之後 我們來實際看一下位圖索引吧
在這裏插入圖片描述當有該關鍵字的時候 就爲1 否則爲0
位圖索引雖然查詢快 但是隻使用某個字段只有固定幾個 另外最大的缺陷是位圖索引的鎖力度非常大 不適合高併發的處理系統

以上就是常見的幾種索引的數據結構了 寫的不好 還希望多多指正

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