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

ske*_*rit 0 mysql skip limit mongodb nosql

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

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

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

Ste*_*nie 5

MySQL的LIMIT大偏移也有类似的挑战.StackOverflow的一些例子:

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

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

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