程序員的進階課-架構師之路(14)-B+樹、B*樹

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接: http://www.javashuo.com/article/p-webnfyfm-cp.html

1、有了B樹,爲啥還有B+、B*樹?

B+樹

       B+樹是B-樹的變體,也是一種多路搜索樹:html

  1. 其定義基本與B-樹同,除了:
  2. 非葉子結點的子樹指針與關鍵字個數相同;
  3. 非葉子結點的子樹指針P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹(B-樹是開區間);
  4.  爲全部葉子結點增長一個鏈指針;
  5.   全部關鍵字都在葉子結點出現;

 如:(M=3)面試

 B+的搜索與B-樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹能夠在非葉子結點命中),其性能也等價於在關鍵字全集作一次二分查找。數據庫

B*樹

       B*-tree是B+-tree的變體,在B+樹的基礎上(全部的葉子結點中包含了所有關鍵字的信息,及指向含有這些關鍵字記錄的指針),B*樹中非根和非葉子結點再增長指向兄弟的指針。編程

 B*樹定義了非葉子結點關鍵字個數至少爲(2/3)*M,即塊的最低使用率爲2/3(代替B+樹的1/2);微信

2、特性

B+樹的特性:

  1. 全部關鍵字都出如今葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字剛好是有序的;
  2. 不可能在非葉子結點命中;
  3. 非葉子結點至關因而葉子結點的索引(稀疏索引),葉子結點至關因而存儲(關鍵字)數據的數據層;
  4. 更適合文件索引系統;

B*樹的特性:

  1. B*樹分配新結點的機率比B+樹要低,空間使用率更高;

3、用途

B/B+樹經過對每一個節點存儲個數的擴展,使得對連續的數據可以進行較快的定位和訪問,可以有效減小查找時間,提升存儲的空間局部性從而減小IO操做。他普遍用於文件系統及數據庫中,如:數據結構

  • Windows:HPFS文件系統 
  • Mac:HFS,HFS+文件系統 
  • Linux:ResiserFS,XFS,Ext3FS,JFS文件系統 
  • 數據庫:ORACLE,MYSQL,SQLSERVER等中

根據B+樹的結構,咱們能夠發現B+樹相比於B樹,在文件系統,數據庫系統當中,更有優點,緣由以下:架構

一、B+樹的磁盤讀寫代價更低 
B+樹的內部結點並無指向關鍵字具體信息的指針。所以其內部結點相對B樹更小。若是把全部同一內部結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入內存中的須要查找的關鍵字也就越多。相對來講I/O讀寫次數也就下降了。 
舉個例子,假設磁盤中的一個盤塊容納16bytes,而一個關鍵字2bytes,一個關鍵字具體信息指針2bytes。一棵9階B-tree(一個結點最多8個關鍵字)的內部結點須要2個盤快。而B+ 樹內部結點只須要1個盤快。當須要把內部結點讀入內存中的時候,B 樹就比B+ 樹多一次盤塊查找時間(在磁盤中就是盤片旋轉的時間)。併發

二、B+樹的查詢效率更加穩定 
因爲內部結點並非最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。因此任何關鍵字的查找必須走一條從根結點到葉子結點的路。全部關鍵字查詢的路徑長度相同,致使每個數據的查詢效率至關。分佈式

二、B+樹更有利於對數據庫的掃描 
B樹在提升了磁盤IO性能的同時並無解決元素遍歷的效率低下的問題,而B+樹只須要遍歷葉子節點就能夠解決對所有關鍵字信息的掃描,因此對於數據庫中頻繁使用的range query,B+樹有着更高的性能。微服務

4、MySQL的B-Tree索引(技術上說B+Tree)

在 MySQL 中,主要有四種類型的索引,分別爲: B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引。咱們主要分析B-Tree 索引。

B-Tree 索引是 MySQL 數據庫中使用最爲頻繁的索引類型,除了 Archive 存儲引擎以外的其餘全部的存儲引擎都支持 B-Tree 索引。Archive 引擎直到 MySQL 5.1 才支持索引,並且只支持索引單個 AUTO_INCREMENT 列。

不只僅在 MySQL 中是如此,實際上在其餘的不少數據庫管理系統中B-Tree 索引也一樣是做爲最主要的索引類型,這主要是由於 B-Tree 索引的存儲結構在數據庫的數據檢索中有很是優異的表現。

通常來講, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的結構來存儲的,也就是全部實際須要的數據都存放於 Tree 的 Leaf Node(葉子節點) ,並且到任何一個 Leaf Node 的最短路徑的長度都是徹底相同的,因此咱們你們都稱之爲 B-Tree 索引。固然,可能各類數據庫(或 MySQL 的各類存儲引擎)在存放本身的 B-Tree 索引的時候會對存儲結構稍做改造。如 Innodb 存儲引擎的 B-Tree 索引實際使用的存儲結構其實是 B+Tree,也就是在 B-Tree 數據結構的基礎上作了很小的改造,在每個Leaf Node 上面出了存放索引鍵的相關信息以外,還存儲了指向與該 Leaf Node 相鄰的後一個 LeafNode 的指針信息(增長了順序訪問指針),這主要是爲了加快檢索多個相鄰 Leaf Node 的效率考慮。

5、總結

  1. 二叉搜索樹:二叉樹,每一個結點只存儲一個關鍵字,等於則命中,小於走左結點,大於走右結點;
  2. B-樹:多路搜索樹,每一個結點存儲M/2到M個關鍵字,非葉子結點存儲指向關鍵字範圍的子結點;
  3. 全部關鍵字在整顆樹中出現,且只出現一次,非葉子結點能夠命中;
  4. B+樹:在B-樹基礎上,爲葉子結點增長鏈表指針,全部關鍵字都在葉子結點中出現,非葉子結點做爲葉子結點的索引;B+樹老是到葉子結點才命中;
  5.  B*樹:在B+樹基礎上,爲非葉子結點也增長鏈表指針,將結點的最低利用率從1/2提升到2/3;

參考資料:

  1. http://www.javashuo.com/article/p-xelaeems-eb.html
  2. http://www.javashuo.com/article/p-hxkeattx-ee.html
  3. https://blog.csdn.net/qq_22613757/article/details/81218741
  4. https://blog.csdn.net/yishizuofei/article/details/81660841

個人微信公衆號:架構真經(id:gentoo666),分享Java乾貨,高併發編程,熱門技術教程,微服務及分佈式技術,架構設計,區塊鏈技術,人工智能,大數據,Java面試題,以及前沿熱門資訊等。每日更新哦!

相關文章
相關標籤/搜索