B+樹是B-樹的變體,也是一種多路搜索樹:html
如:(M=3)面試
B+的搜索與B-樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹能夠在非葉子結點命中),其性能也等價於在關鍵字全集作一次二分查找。數據庫
B*-tree是B+-tree的變體,在B+樹的基礎上(全部的葉子結點中包含了所有關鍵字的信息,及指向含有這些關鍵字記錄的指針),B*樹中非根和非葉子結點再增長指向兄弟的指針。編程
B*樹定義了非葉子結點關鍵字個數至少爲(2/3)*M,即塊的最低使用率爲2/3(代替B+樹的1/2);微信
B/B+樹經過對每一個節點存儲個數的擴展,使得對連續的數據可以進行較快的定位和訪問,可以有效減小查找時間,提升存儲的空間局部性從而減小IO操做。他普遍用於文件系統及數據庫中,如:數據結構
根據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+樹有着更高的性能。微服務
在 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 的效率考慮。
參考資料:
個人微信公衆號:架構真經(id:gentoo666),分享Java乾貨,高併發編程,熱門技術教程,微服務及分佈式技術,架構設計,區塊鏈技術,人工智能,大數據,Java面試題,以及前沿熱門資訊等。每日更新哦!