为啥 MongoDB skip() 不使用索引?
Posted
技术标签:
【中文标题】为啥 MongoDB skip() 不使用索引?【英文标题】:Why MongoDB skip() doesn't use indexes?为什么 MongoDB skip() 不使用索引? 【发布时间】:2021-09-21 23:49:56 【问题描述】:MongoDB 的文档中指出,使用带有大偏移量的 skip() 会很慢。
skip() 方法要求服务器在开始返回结果之前从输入结果集的开头开始扫描。随着偏移量的增加,skip() 会变慢。
假设我们排序的字段上有一个索引,为什么 MongoDB 不能直接“跳转”到正确的位置?例如如果我们有一个排序数组,我们可以得到 O(1) 中的第 100 项。为什么数据库不能这样做?
据我了解,SQL 数据库中的 OFFSET/LIMIT 会发生完全相同的情况,因此我非常感谢能涵盖这两种情况的答案。
【问题讨论】:
【参考方案1】:索引不作为数组存储在磁盘/内存中。它们存储为类似于链表的树。
因此,正如你所说,“跳”到正确的地方是不可能的。
请注意,文档并没有说服务器迭代文档,而是迭代结果集。理论上,这可以通过索引扫描来完成。
【讨论】:
谢谢,我想我现在明白它的工作原理了。以上是关于为啥 MongoDB skip() 不使用索引?的主要内容,如果未能解决你的问题,请参考以下文章