先说B树和B+树的区别
B树:非叶子节点也存储数据
B+树:只有叶子节点存储数据,且所有叶子节点通过指针相连接。
为什么MongoDB选择B树而,MySQL选择B+树呢?两种数据结构的区别摆在上面了,那就看MongoDB和MySQL的需求
首先:
MongoDB属于文档型存储的NoSQL,意味着它并不是关系型数据库,既然如此,基本不会出现批量连续数据的查询,那么B+树的叶子节点通过指针相连接对于MongoDB来说,就没多少价值了。
再看看B树的优缺点(相对于B+树):
优点:数据直接存在于非叶子节点上,最近查询时间复杂度为O(1)
缺点:叶子节点不通过指针连接,不适合范围查询
到这里,基本已经清楚了为什么MongoDB选择B树而不是B+树了。
解释一下为什么文档型NoSQL为什么基本不会出现连续数据查询:
关系型数据库的数据结构
id | type |
1 | a |
2 | a |
3 | b |
如果通过type构建索引,查询是:
SELECT id FROM t1 WHERE type='a';
是不是查找一段连续的数据呢?或者包含join的查询同理
那么MongoDB就不会有这种查询吗?
不是不会有这种查询,而是一般不会这样设计
MongoDB中的设计
{
"_id":"1",
"type":"a",
"id":[
1,
2,
3
]
}
看到了吗?用type建立索引,查询一条数据就拿到想要的结果了。
引发思考(私货):
MongoDB很多情况下用来存储日志,如果需要将日志分类存储,且对查询速度要求较高,可以通过物化视图,将同类的日志内容合并,提高查询速度。