mysql - 为什么 MongoDB 的 skip() 这么慢不好用,而 MySQL 的 LIMIT 这么快?

标签 mysql mongodb limit skip nosql

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

老实说,我很想知道为什么在 NoSQL 数据库中实现类似 LIMIT 的函数如此困难。

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

最佳答案

MySQL 的 LIMIT 具有类似的大偏移量挑战。来自 StackOverflow 的几个示例:

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

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

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

关于mysql - 为什么 MongoDB 的 skip() 这么慢不好用,而 MySQL 的 LIMIT 这么快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20718929/

相关文章:

mysql - 基于 Windows 的 MySQL 分析工具

mysql - NoSQL 模式中的 SQL 关系

python - 如何在 MongoKit 中关闭光标

mongodb - 如果副本集中的最大节点数关闭,如何将辅助节点转换为主节点?

php - 不允许 > 2mb 的图像

c - 为什么在 C 中访问数组有限制?

mysql - 如何在 mysql 的查询中定义可选约束

mysql - couchdb 相当于关系数据库模型

mysql - 当一次预订中有多个类别时,获取两个日期之间的可用房间

android - 如何移除Activity Stack底部的Activity?