前言
還是關於面試的時候會提到的問題吧:
為什麼會存在b-樹?
mysql的底層資料結構是什麼?
為什麼要用b+樹不用b樹?
為什麼用b+樹儲存索引而不是hash索引?hash索引o(1)不是更快嗎?
b-樹首先要了解 b+樹 的話,我們先看看為什麼會存在b-樹?
為什麼會存在b-樹?
這個問題經常會有人一臉懵逼,為什麼會存在b樹?啊?為什麼?我咋知道為什麼?我只知道它是什麼,它與別人的區別,我咋知道為什麼會存在b-樹啊?因為它存在所以它存在嗎。。。
那麼到底為什麼會存在b-樹呢?, 我們可以看看b-樹叫什麼先,它又叫 多路搜尋樹 。
為什麼是多路?
這裡的話又有人會問了,那多路,無限多路下去最後不就是乙個陣列嗎?為什麼不直接用陣列呢?
確實,無限多路下去確實就是乙個有序陣列了,但是打住,我們可以看看b-樹實際應用在什麼地方, 這裡的話主要用在檔案系統的索引比較多 。
那為什麼檔案系統索引不用紅黑樹或者有序陣列呢?
對於檔案系統我們可以知道,樹的高度代表了磁碟io的次數,紅黑樹我們首先可以排除了,太高。那有序陣列不是更好?一次io就完事了唄,不是更有效率。
但是我們檔案系統的檔案小還好說,但是檔案大了的話,你不一定能一次性把它全部載入到記憶體中的呀。
如果一次性無法全部加載入記憶體應該如何查詢?
這立馬就明白了吧!這就是b-樹的厲害之處呀, 多路儲存 ,每次只載入乙個節點,一步一步往下查詢。b-樹就是為此而存在的,它既保證了 高度低 ,又保證了 資料多 ,也就是我們常說的「矮胖」。
總結所以我們知道,如果在記憶體中,紅黑樹確實比b-樹更加高效,但是涉及到磁碟操作的話,b-樹就顯得更優秀了。
b-樹的性質
上面說到了為什麼會存在b-樹,那麼我們來看看b-樹有什麼性質。
這個 b-樹 就叫 b樹 而不叫 b減樹。
b-樹 它是一種多路搜尋樹,一般m階的b樹主要特點有:
根節點至少有兩個子女。
每個非根節點所包含的關鍵字個數k滿足: m/2-1 <= k <= m-1。
除根節點外的非葉子節點的兒子樹的個數滿足 m/2 <= k <= m。
所有的葉子節點都位於同一層。
看起來確實有點複雜,不過沒關係,我們來看看b-樹的具體結構先:
這顆b樹中,我們重點來看看(54,73)節點, 該節點有兩元素,54和73,又有三個孩子分別是48、60、(92,105),可以看到這三個孩子是按照它的父節點區分開的,正好符合我們上面提到的b-樹的特徵。
b-樹的查詢
我們上面看到了b-樹的大致結構,那麼為什麼要叫 多路搜尋樹 呢?它是如何實現高效的查詢的?
我們可以就上面的樹來查檢視,加入我們要查詢數字92。
第一次磁碟io:
與46比較後第二次磁碟io:
與(45,73)比較後第三次磁碟io:
與(92, 105比較)找到92:
通過整個流程我們也可以看出,b-樹在查詢中的比較次數沒有比二叉搜尋樹少多少,但b-樹本身優化的點就不在這裡。
b-樹它的優化的重點在於 「 減少磁碟的io次數 」 ,我們知道磁碟不是記憶體,磁碟重新整理頁的效率沒有記憶體那麼高效,所以減少磁碟的io次數可以大大的提公升查詢的效率。
關於插入和刪除操作就先不說了。
b+樹b+樹的性質
b+樹是b樹的一種變形形式,b+樹上的 葉子結點儲存關鍵字以及相應記錄的位址 , 葉子結點以上各層作為索引 使用。一棵m階的b+樹定義如下:
每個節點最多有m個子女;
除根節點外,每個節點至少有 m/2 個子女,根節點至少有兩個子女;
有k個子女的節點必有k個關鍵字。
這裡重點說一下b+樹與b樹的主要區別:
資料的查詢方式不同 ,b+樹查詢必須查詢到葉子節點,b樹只要匹配到即可不用管元素位置,因此b+樹查詢更穩定(並不慢)。
資料儲存的位置不同 ,b+樹的非葉子節點只是用來索引用的,所有資料都是存在葉子節點上,所以b+樹的磁碟也可以容納更多資料。
b+樹葉子節點是個鍊錶 , 我們知道b+樹的資料都在葉子節點,那麼對於範圍查詢的情況,b-樹就需要重複的中序遍歷,而b+樹只需要遍歷葉子節點鍊錶即可。
為什麼會存在b+樹?
老問題了,首先我們還是先看看b+樹的應用場景。我們知道mysql底層的資料結構用的就是b+樹。
為什麼b+樹的結構要這麼設計?非葉子節點索引?底層資料鏈表?為什麼用b+樹而不用b-樹?
ok,我們考慮一下mysql常用的查詢就好了。
假設我們現在有個孩子表child,我按照id排序選10條。應該怎麼查?
如果是b-樹的話,我們需要 多次中序遍歷 。
如果是b+樹的話,由於有鍊錶結構,所以只需要確認首尾,通過鍊錶就可以把資料取出來了。
比如這個圖里,我查詢46-61的所有節點:
為什麼用b+樹儲存索引而不是hash索引?hash索引它o(1)不是更快嗎?
查詢單條資料確實hash索引快,但同上,b+樹支援 範圍查詢 ,而hash索引做不到。
而且資料庫索引一般儲存在磁碟中,載入進記憶體中如果資料量大的話 無法一次裝入記憶體 ,b+樹的設計可以允許資料 分批載入 ,同時樹的高度較低,提高查詢效率。
都結合網上資料加上自己的一些理解,如果有影響到他人的地方,可以聯絡我:[email protected]
Mysq之索引(一) 索引資料結構
之前為了搞清楚這塊問題,看了很多文章都寫的迷迷糊糊的,我盡量寫的簡單明瞭一點,包看懂就好。先來思考索引的幾個問題?1.為什麼要給表加上主鍵?2.為什麼加索引後會使查詢變快?3.為什麼加索引後會使寫入 修改 刪除變慢?4.什麼情況下要同時在兩個欄位上建索引?帶著問題我們接下來看,索引是什麼?它的底層是...
mysql 資料結構 Mysql索引資料結構
mysql索引資料結構 當慢查詢時,看sql是否走索引。索引的本質 索引是幫助mysql高效獲取資料的排好序的資料結構。mysql若不建立索引,查詢某條資料時則會逐行掃瞄,每掃瞄一行資料就會做一次磁碟io。b tree 葉節點具有相同的深度,葉節點的指標為空。所有索引元素不重複。葉節點中的資料索引從...
mysql資料結構
在剛才新建表的過程中,我們提到了資料型別,mysql 的資料型別和其他程式語言大同小異,下表是一些 mysql 常用資料型別 整數型 整數除了 int 外,還有 tinyint smallint mediumint bigint。字元型 char 和 varchar 的區別 char 的長度是固定的...