Mongodb與MySQL索引的區別
Mongodb與MySQL索引的區別
Mongodb索引使用B樹,而MySQL使用B+樹。那麼這兩者的區別是什麼?
注意:這裡的Mysql指的是Innodb的儲存引擎下的索引結構,其他儲存引擎暫不考慮。
1、B+樹的特點
1)資料只出現在葉子節點
2)所有葉子節點增加了一個鏈指標
2、B樹的特點
1)樹內的每個節點都儲存資料
2)葉子節點之間無指標相鄰
3、Mongodb與MySQL索引的區別
可以從兩個角度來看
1)資料結構
B樹和B+樹最重要的一個區別就是B+樹只有葉節點存放資料,其餘節點用來索引,而B-樹是每個索引節點都會有Data域。這就決定了B+樹更適合外部儲存,也就是磁碟儲存。
B+樹所有的Data域都在葉子節點,一般來說都會進行一個優化,就是將所有的葉子節點用指標串起來。這樣遍歷葉子節點就能獲得全部資料,這樣就能進行區間訪問啦。
2)設計角度
mongodb並不是傳統的關係性資料庫,而是以Bson(Binary-JSON)格式作為儲存的nosql,目的就是高效能,高可用,易擴充套件。首先它擺脫了關係模型,對於區間訪問的需求就沒那麼強烈了。
其次Mysql由於使用B+樹,資料都在葉節點上,每次查詢都需要訪問到葉節點,而MongoDB使用B樹,所有節點都有Data域,只要找到指定索引就可以進行訪問,無疑單次查詢平均快於Mysql。
4、總結
針對上面的B+樹和B樹的特點,我們做一個總結
1)B樹的樹記憶體儲資料,因此查詢單條資料的時候,B樹的查詢效率不固定,最好的情況是O(1)。我們可以認為在做單一資料查詢的時候,使用B樹平均效能更好。但是,由於B樹中各節點之間沒有指標相鄰,因此B樹不適合做一些資料遍歷操作。
2)B+樹的資料只出現在葉子節點上,因此在查詢單條資料的時候,查詢速度非常穩定。B+樹查詢時間複雜度固定是logn,B樹查詢複雜度最好是 O(1)。因此,在做單一資料的查詢上,其平均效能並不如B樹。但是,B+樹的葉子節點上有指標進行相連,因此在做資料遍歷的時候,只需要對葉子節點進行遍歷即可,這個特性使得B+樹非常適合做範圍查詢。
因此,我們可以做一個推論:沒準是Mysql中資料遍歷操作比較多,所以用B+樹作為索引結構。而Mongodb是做單一查詢比較多,資料遍歷操作比較少,所以用B樹作為索引結構。
幾點疑問
1、那麼為什麼Mysql做資料遍歷操作多?而Mongodb做資料遍歷操作少呢?
因為Mysql是關係型資料庫,而Mongodb是非關係型資料。
2、那為什麼關係型資料庫,做資料遍歷操作多?而非關係型資料庫做資料遍歷操作少呢?
結論:
因此,由於關係型資料庫和非關係型資料的設計方式上的不同。導致在關係型資料中,遍歷操作比較常見,因此採用B+樹作為索引,比較合適。而在非關係型資料庫中,單一查詢比較常見,因此採用B樹作為索引,比較合適。
參考連結:https://www.cnblogs.com/rjzheng/p/12316685.html