B-樹和B+樹最重要的一個區別就是B+樹只有葉節點存放數據,其他節點用來索引,而B-樹是每一個索引節點都會有Data域。html
B+樹是爲磁盤及其餘存儲輔助設備而設計一種平衡查找樹(不是二叉樹)。B+樹中,全部記錄的節點按大小順序存放在同一層的葉節點中,各葉節點用指針進行鏈接。程序員
數據庫中B+樹索引分爲彙集索引(clustered index)和非彙集索引(secondary index).這兩種索引的共同點是內部都是B+樹,高度都是平衡的,葉節點存放着全部數據。不一樣點是葉節點是否存放着一整行數據。面試
B+樹有以下特色:算法
通俗的講sql
緣由是數據都是存儲在葉子節點這一層,而且有指針指向其餘葉子節點,這樣範圍查詢只須要遍歷葉子節點這一層,無需整棵樹遍歷。數據庫
因爲磁盤的存取速度與內存之間鴻溝,爲了提升效率,要儘可能減小磁盤I/O.磁盤每每不是嚴格按需讀取,而是每次都會預讀,磁盤讀取完須要的數據,會順序向後讀必定長度的數據放入內存。而這樣作的理論依據是計算機科學中著名的局部性原理:segmentfault
當一個數據被用到時,其附近的數據也一般會立刻被使用,程序運行期間所須要的數據一般比較集中微信
B-樹,這裏的 B 表示 balance( 平衡的意思),B-樹是一種多路自平衡的搜索樹
它相似普通的平衡二叉樹,不一樣的一點是B-樹容許每一個節點有更多的子節點。網絡
B-樹有以下特色多線程
B+樹內節點不存儲數據,全部 data 存儲在葉節點致使查詢時間複雜度固定爲 log n。而B-樹查詢時間複雜度不固定,與 key 在樹中的位置有關,最好爲O(1)
咱們說過,儘量少的磁盤 IO 是提升性能的有效手段。MongoDB 是聚合型數據庫,而 B-樹剛好 key 和 data 域聚合在一塊兒。
至於MongoDB爲何使用B-樹而不是B+樹,能夠從它的設計角度來考慮,它並非傳統的關係性數據庫,而是以Json格式做爲存儲的nosql,目的就是高性能,高可用,易擴展。首先它擺脫了關係模型,上面所述的優勢2需求就沒那麼強烈了,其次Mysql因爲使用B+樹,數據都在葉節點上,每次查詢都須要訪問到葉節點,而MongoDB使用B-樹,全部節點都有Data域,只要找到指定索引就能夠進行訪問,無疑單次查詢平均快於Mysql。
簡單地說,哈希索引就是採用必定的哈希算法,把鍵值換算成新的哈希值,檢索時不須要相似B+樹那樣從根節點到葉子節點逐級查找,只需一次哈希算法便可馬上定位到相應的位置,速度很是快。
備註:以上內容均摘抄自網絡,並不是原創,僅供我的學習交流使用,望各路大牛,發現不對的地方,不吝賜教,留言便可。
關注微信公衆號「搜雲庫」獲取最新文章
【福利】公衆號後臺回覆 「進羣」
【福利】邀請您進微信 「技術分享羣」
【福利】羣裏有不少技術大佬,免費提問,互相學習