上回提到mongo怎么进行模式设计。今天就来聊聊mongo的索引B树。
https://docs.mongodb.com/manual/indexes/ (MongoDB indexes use a B-tree data structure.)
我们知道mysql的索引是特殊的B+树,根节点只保存索引字段,叶子节点才真正存有数据,如果是聚簇索引叶子节点存有该行所有数据,其他索引存的是索引列和ID,特殊的B+树是因为叶子节点是双向链表,所以mysql的范围查询性能是比较高的
B树的话,则为根节点也保存数据,而且叶子节点不包括根节点,叶子节点也没有链表。
这样导致根据索引查数据时命中即可返回,不需要每次都到叶子节点才能取得数据,而且树占用空间会比B+树小。
mongo如果采用B树也可以理解
mongo属于nosql,集合间关联关系不大,MongoDB应用场景为单个文档查询时。此时时间复杂度最好可以到O(1)。
但是mongo对于单个集合的聚合操作支持度挺好,单个集合的范围查询在业务上也比较常见;而且看极客时间的时候,讲师也说用的是B+树。那么mongo是否采用B+树?
根据官方文档可以发现,mongo在3.2版本后采用了WiredTiger
https://docs.mongodb.com/manual/core/wiredtiger/ (Starting in MongoDB 3.2, the WiredTiger storage engine is the default storage engine. )
根据WiredTiger文档,可以发现WiredTiger的索引采用的是B+树
http://source.wiredtiger.com/mongodb-3.4/tune_page_size_and_comp.html
WiredTiger maintains a table's data in memory using a data structure called a B-Tree ( B+ Tree to be specific), referring to the nodes of a B-Tree as pages. Internal pages carry only keys. The leaf pages store both keys and values.
因此结论:mongo的索引采用的也是B+树
网友评论