为啥 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() 不使用索引?的主要内容,如果未能解决你的问题,请参考以下文章

为啥以及何时需要在 MongoDB 中重建索引?

MongoDB基础

为啥mongodb返回地理索引错误?

即使有索引,MongoDB 也发现查询非常慢

最全 MongoDB 基础教程

为啥索引的方向在 MongoDB 中很重要?