为什么MongoDB的skip()使用起来如此之慢和糟糕,而MySQL的LIMIT如此之快?

时间:2013-12-21 12:19:13

标签: mysql mongodb limit skip nosql

Mongo的skip()适用于小型集合,但是一旦你有几千条记录,它就会开始变慢。

我真的想知道为什么NoSQL数据库中类似LIMIT的功能如此难以实现。

我一直在阅读的唯一“解决方案”是使用基于范围的查询。但对于很多不可行的解决方案。

2 个答案:

答案 0 :(得分:5)

MySQL的LIMIT在大偏移方面也面临着类似的挑战。 StackOverflow的几个例子:

具有大跳过/偏移值的限制查询效率的根本问题是,为了使数据库查询到达可以开始返回记录的点,必须跳过大量索引条目。对于具有活动写入(插入/更新/删除)的数据库,如果不隔离查询或缓存结果,这也可能导致一些有趣的调页副作用。

基于范围的分页是一种更有效的方法,可以利用索引,但正如您所说,它可能不适合所有用例。如果您经常需要跳过数千条记录并发现它太昂贵,您可能需要调整数据模型,添加一些缓存或在用户界面中添加使用限制。

例如,在通过Google搜索结果进行通用术语分页时,可能会有数亿个结果。如果您一直点击页面,您最终会发现UI限制为1,000个结果(可能相当于50-100页,具体取决于过滤的结果数量)。另一种流行的UI方法是Continuous Scrolling,它避免了一些常见的分页问题(虽然会产生其他可用性挑战)。

答案 1 :(得分:0)

我遇到了与skip()相同的问题。当我的数据库文件较少但性能开始影响我的文档计数超过10L时,一切正常。

我不得不摆脱跳过,但随后获取特定数据对我来说是一个挑战。下面的博客帮助了我。

https://scalegrid.io/blog/fast-paging-with-mongodb/