為什麼有關MongoDB採用B樹索引,以及Mysql B+樹做索引?

Mysql innodb採用B+樹做索引,而MongoDB 使用了B樹做索引,為什麼不頭選用B樹或B+樹呢,B樹和B+樹在 MongoDB和Mysql有什麼分別使用的場景嗎?


寫了篇文章:)

從 MongoDB 及 Mysql 談B/B+樹

-------------------------------------------------------------------------------------

謝邀~

強答一發- -,不熟悉 mongoDB,大概了解了下是nosql,文檔型資料庫

先從數據結構的角度來答。

題主應該知道B-樹和B+樹最重要的一個區別就是B+樹只有葉節點存放數據,其餘節點用來索引,而B-樹是每個索引節點都會有Data域。

這就決定了B+樹更適合用來存儲外部數據,也就是所謂的磁碟數據。

從Mysql(Inoodb)的角度來看,B+樹是用來充當索引的,一般來說索引非常大,尤其是關係性資料庫這種數據量大的索引能達到億級別,所以為了減少內存的佔用,索引也會被存儲在磁碟上。

那麼Mysql如何衡量查詢效率呢?磁碟IO次數,B-樹(B類樹)的特定就是每層節點數目非常多,層數很少,目的就是為了就少磁碟IO次數,當查詢數據的時候,最好的情況就是很快找到目標索引,然後讀取數據,使用B+樹就能很好的完成這個目的,但是B-樹的每個節點都有data域(指針),這無疑增大了節點大小,說白了增加了磁碟IO次數(磁碟IO一次讀出的數據量大小是固定的,單個數據變大,每次讀出的就少,IO次數增多,一次IO多耗時啊!),而B+樹除了葉子節點其它節點並不存儲數據,節點小,磁碟IO次數就少。這是優點之一。

另一個優點是什麼,B+樹所有的Data域在葉子節點,一般來說都會進行一個優化,就是將所有的葉子節點用指針串起來。這樣遍歷葉子節點就能獲得全部數據,這樣就能進行區間訪問啦。

至於MongoDB為什麼使用B-樹而不是B+樹,可以從它的設計角度來考慮,它並不是傳統的關係性資料庫,而是以Json格式作為存儲的nosql,目的就是高性能,高可用,易擴展。首先它擺脫了關係模型,上面所述的優點2需求就沒那麼強烈了,其次Mysql由於使用B+樹,數據都在葉節點上,每次查詢都需要訪問到葉節點,而MongoDB使用B-樹,所有節點都有Data域,只要找到指定索引就可以進行訪問,無疑單次查詢平均快於Mysql(但側面來看Mysql至少平均查詢耗時差不多)。

總體來說,Mysql選用B+樹和MongoDB選用B-樹還是以自己的需求來選擇的。


推薦閱讀:

python 如何連同依賴打包發布以及python的構建工具?
大家常用哪個MySQL客戶端工具,除了命令行那個mysql之外?
如何看待MySQL發布的Group Replication?
怎樣在 MySQL 表中存儲樹形結構數據?

TAG:MySQL | MongoDB | 數據結構 | BB樹 |