mysql 為什麼使用b 樹作為索引的結構

2021-09-29 03:43:58 字數 2184 閱讀 2678

mysql 為什麼使用b+樹作為索引的結構

一 b樹的特性

1.關鍵字分布再整棵樹的所有節點

2.任何乙個關鍵字出現且只出現在乙個節點中。

3.搜尋有可能在非葉子節點結束.

4.其搜尋效能等價於再關鍵字全集內做一次二分查詢

二 b+樹的特性(b+樹是b樹的一種變形樹 可以解決某些問題)

1.所有關鍵字都出現在葉子節點的鍊錶中,且鍊錶中的關鍵字是有序的。

2.搜尋只在葉子節點命中

3.非葉子節點相當於是葉子節點的索引,葉子節點是儲存關鍵字資料的資料層

三 紅黑樹或者平衡二叉樹的其他樹結構,

1.h明顯要深的多,執行效率低

2.邏輯上很近的節點(父子)物理上可能很遠,無法利用區域性性,

3.每個節點儲存的資料量太小了,對磁碟空間造成浪費,帶來頻繁的io操作。

所以其他樹結構的效率明顯比b樹差很多。

四 資料庫索引的b+數與b樹的差異總結

1.非葉子節點的子樹指標與關鍵字個數相同

2.非葉子節點的子樹指標p[i],指向關鍵字值屬於[k[i],k[i+1])的子樹(注意,區間是前閉後開)。

3.為所有葉子節點增加可乙個連指標

4.所有關鍵字都在葉子節點出現。

五 b樹和b+樹適合做索引的原因

1.區域性性原理與磁碟預讀

由於儲存介質的特性,磁碟本身訪問就比主存慢很多,再加上機械運動耗費,磁碟的訪問速度往往是主存的幾百分之一,因此為了提高效率,要儘量減少磁碟i/o。 為了達到這個目的,磁碟往往不是嚴格按需讀取,而是每次都會預讀,即使只需要乙個位元組,磁碟也會從這個位置開始,順序向後讀取一定長度的資料放入記憶體。這樣做的理論依據是電腦科學中著名的區域性性原理:

當乙個資料被用到時,其附近的資料也通常會馬上被使用——程式執行期間所需要的資料通常比較集中。

由於磁碟順序讀取的效率很高(不需要尋道時間,只需很少的旋轉時間),因此對於具有區域性性的程式來說,預讀可以提高i/o效率。

預讀的長度一般為頁的整倍數。頁是計算機管理儲存器的邏輯塊,硬體及作業系統往往將主存和磁碟儲存區分割為連續的大小相等的塊,每個儲存塊稱為一頁(在許多作業系統中,頁得大小通常為4k),主存和磁碟以頁為單位交換資料。當程式要讀取的資料不在主存中時,會觸發乙個缺頁異常,此時系統會向磁碟發出讀盤訊號,磁碟會找到資料的起始位置並向後連續讀取一頁或幾頁載入記憶體中,然後異常返回,程式繼續執行。

一般來說,磁碟i/o次數可以用於評價索引結構的優劣,資料庫系統的設計者巧妙利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁,這樣每個節點只需要一次i/o就可以完全載入。

2. 每次新建節點時,直接申請乙個頁的空間,這樣就保證乙個節點物理上也儲存在乙個頁裡,加之計算機儲存分配都是按頁對齊的,就實現了乙個節點只需一次i/o。

3. b樹中一次檢索最多需要h-1次i/o(根節點常駐記憶體)。一般實際應用中,出度d(樹的分叉數)是非常大的數字,通常超過100;h非常小,通常不超過3。

相對b樹,b+樹做索引的優勢(mysql 選擇b+樹作為索引的原因)

1.b+樹的磁碟讀寫代價更低:b+樹的內部節點並沒有指向關鍵字具體資訊的指標(指向了關鍵字),因此其內部節點相對b樹更小,如果把所有同一內部節點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多,一次性讀入記憶體的需要查詢的關鍵字也就越多,相對io讀寫次數就降低了。(b+樹的中間節點不儲存資料,所以磁碟頁能容納更多節點元素,更「矮胖」;)

2.b+樹的查詢效率更加穩定:由於所有資料都存於葉子節點。所有關鍵字查詢的路徑長度相同,每乙個資料的查詢效率相當。(查詢效率穩定、並不慢)

3.b樹在提高了io效能的同時並沒有解決元素遍歷的我效率低下的問題,b樹需要重複地中序遍歷,正是為了解決這個問題,b+樹應用而生。b+樹只需要去遍歷葉子節點就可以實現整棵樹的遍歷。(主要原因吧  並且對精典b+樹做了優化增加了順序訪問指標。)

mongodb的索引為什麼選擇b樹,而mysql的索引是b+樹

mongodb不是傳統的關係性資料庫,而是以json格式作為儲存的nosql,目的就是高效能,高可用,易擴充套件。首先它擺脫了關係模型,所以範圍查詢和遍歷查詢的需求就沒那麼強烈了,其次mysql由於使用b+樹,資料都在葉節點上,每次查詢都需要訪問到葉節點,而mongodb使用b-樹,所有節點都有data域,只要找到指定索引就可以進行訪問。

總體來說,mysql選用b+樹和mongodb選用b-樹還是以自己的需求來選擇的。

參考鏈結  

為什麼MySQL使用B 樹?

首先需要理解磁碟io的原理 硬碟中一般會有多個碟片組成,每個碟片包含兩個面,每個盤面都對應地有乙個讀 寫磁頭。將磁軌劃分為若干個弧段,每個磁軌上乙個弧段被稱之為乙個扇區 圖踐綠色部分 扇區是磁碟的最小組成單元。硬碟通常由重疊的一組碟片構成,每個盤面都被劃分為數目相等的磁軌,並從外緣的 0 開始編號,...

MySQL面試題 為什麼使用B 樹作為索引?

問 你的系統使用了什麼資料庫?答 是使用的mysql資料庫。問 你了解過mysql索引嗎?有哪些呢?答 mysql常用的有innodb和myisam索引。問 那innodb底層採用的是什麼結構呢?答 它底層採用的是b 樹的結構,內部也支援hash的結構。好了,面試官引導的差不多了,接下去就要好好回答...

InnoDB儲存引擎為什麼選擇B 樹構建索引

索引是對資料庫表中乙個或多個列的值進行排序的資料結構,以協助快速查詢 更新資料庫表中資料。在mysql中,索引是在儲存引擎層實現的,所以並沒有統一的索引標準,即不同儲存引擎的索引的工作方式並不一樣。而即使多個儲存引擎支援同一種型別的索引,其底層的實現也可能不同。索引加速了資料訪問,因為儲存引擎不會再...