快速查詢的資料型別大致有hash表,二叉樹,平衡二叉樹,b-tree,b+tree。
hash表查詢方式是基於資料的key的hashcode得到陣列下標,如果儲存的為鍊錶,則遍歷鍊錶進行value比較;如果儲存的為紅黑樹,則用二分查詢法。
所以hash表在數量量不大,並且進行等值查詢的時候效率較高,但不能範圍查詢。
二叉樹資料的組織方式是左小右大:即當前存入的資料比當前節點的關鍵字小,遞迴左子節點;若當前存入資料比當前節點的關鍵字大.遞迴右子節點。
如果我們用自增序列作為主鍵建立索引,則會形成
所以就衍生平衡二叉樹
平衡二叉樹為了保證樹的平衡性,在資料的插入和刪除的過程中,會進行一系列的計算.將樹進行左/右旋轉滿足樹的平衡性
但是平衡二叉樹在數量大的時候樹高會很高,再查詢末端節點會遞迴多次才能找到資料,並且每個階段只存乙個資料會有多次的io操作才能找到資料。
作業系統與磁碟的互動是採用頁為基本的交換單位.一頁資料大小是4kb,再加上作業系統的預讀能力[空間區域性性原理],一次磁碟的io互動將會帶來n頁的資料返回,而乙個節點只要乙個資料,完全沒法填滿,一次io只能有少量的有效資料
b-tree的優勢
1.將磁碟io的低效操作通過記憶體中資料比較進行替換
在二叉樹中,我們一次只能載入乙個關鍵字進行匹配.但是在b-樹,我們一次可以載入n個關鍵字,若我們將磁碟塊(節點)的空間大小固定(mysql中定義為16kb).磁碟塊能儲存的關鍵字個數就會與單個關鍵字內容占用的空間相關.基於預讀和作業系統磁碟互動特性.我們磁碟io一次載入的內容正好都是我們需要比對的內容.講內容的多次io載入轉換成在記憶體中進行資料的比較
2.合理的降低樹的高度,減少io的次數
假如乙個節點則可以放入1000個有效資料,二層則有10011000,三層就要(10011000+1)*1000。則b-tree只需要三層就能儲存超過10億的資料。
b+樹是基於b-樹結構的加強版樹形結構.
b-樹擁有的特性b+樹都擁有.
b+樹的資料匹對規則採用閉合區間的方式
b+樹的非葉子節點上不儲存關鍵字對應的資料區
b+樹的葉子節點上儲存資料區
在葉子節點上的資料產生形成首尾相連的鏈式結構帶來更高效的資料排序
基於以上你的結構特點b+樹相較於b-樹又哪些優勢呢?
b-樹擁有的特性,b+樹都擁有
b+樹擁有更強勁的磁碟io能力.
在非葉子節點不存在資料區,將大大降低節點的空間占用.能儲存更多的關鍵字.一次磁碟io帶回來的有效資料將更多更精準
b+樹擁有更好的資料排序能力
這是b+樹的天然優勢,在最末尾的葉子節點這一層天然即有序的鏈式結構
基於b+樹的掃表能力更強
在b+樹的資料結構中,若需要掃表,只需要掃瞄最末尾的葉子節點即可.
基於b+樹結構的索引的查詢,更趨於穩定
在b-樹結構中,我們發現,我們的關鍵字在某乙個節點進行匹對成功就完成資料區內容的返回.但是在b+樹結構中,我們採用的是閉合區間的比對方式即資料的最終載入一定會在葉子節點上.在b-樹結構中,有可能針對一張表的查詢,有些資料需要3次io.有些只需要1次io.前後的查詢效率跌跌宕宕不穩定.但是在b+樹結構中一定恆定的io次數,帶來更穩定的查詢效率.基於以上的對比和總結,mysql最終選擇了b+tree作為了索引的資料結構
mysql的索引資料結構 資料庫索引資料結構分析
資料庫索引資料結構分析 為什麼要有b樹?計算機有乙個區域性性原理,就是說,當乙個資料被用到時,其附近的資料也通常會馬上被使用。所以當你用紅黑樹的時候,你一次只能得到乙個鍵值的資訊,而用b樹,可以得到最多m 1個鍵值的資訊。這樣來說b樹當然更好了。另外一方面,同樣的資料,紅黑樹的階數更大,b樹更短,這...
MySQL索引原理之索引原理
索引定義 是儲存引擎用於快速查詢記錄的一種資料結構。需要額外開闢空間和資料維護工作。索引是物理資料頁儲存,在資料檔案中 innodb,ibd檔案 利用資料頁 page 儲存。索引可以加快檢索速度,但是同時也會降低增刪改操作速度,索引維護需要代價。索引涉及的理論知識 二分查詢法 hash和b tree...
mysql索引要素 mysql 索引的原理
1 考慮下面的情況,mysql desc student field type null key default extra school varchar 64 yes null name varchar 64 yes null birthday date yes null 3 rows in se...