使用 B-tree 来进行索引的 MongoDB 是怎么处理一个范围查询的?

2020-02-23 23:05:57 +08:00
 LoremIpSum

传统的关系型数据库,如 Mysql,SqlServer 都是用 B+tree 来进行索引的,也就是说如果执行一个范围查询如:

SELECT * FROM USERS A WHERE A.Id BETWEEN 5 AND 1000;

这个时候查询优化器会使用主键 ID 上的唯一索引先找到 ID=5 的记录,然后以此去遍历叶子节点上面的记录,直到 ID>1000 的时候停止。

那么好,问题来了,MongoDb 使用 B-tree 进行索引,那么意味着叶子节点之间不是以链表的形式链接在一起的,这个时候同样的查询,假设 MongoDB 找到了记录为 5 的记录(并且这个时候这笔 ID 为 5 的记录就是在 B-tree 的叶子节点上面), 接下来会怎么处理?找了很久都没才找到相关的资料

2281 次点击
所在节点    程序员
3 条回复
xupefei
2020-02-23 23:21:15 +08:00
B tree 也是可以运行 range query 的。需要访问多个节点,把数据组合起来。
比如这个数 https://media.geeksforgeeks.org/wp-content/cdn-uploads/BTreeIntro1.png 里,想拿到所有的<20 就要访问三个节点:3 30 60,1 2,4 5 6。最后组合的结果是 1 2 3 4 5 6。
LoremIpSum
2020-02-23 23:27:18 +08:00
@xupefei 是这样的吗? Thanks !
lhx2008
2020-02-24 09:06:48 +08:00
BTree 是搜索树的一种,本来就可以范围查找。不能的话用 hashmap 就行了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/646933

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX