讲师中心 微信公众号
AI工具推荐 视频效率加速

MongoDB深分页查询越来越慢如何优化?

小芳姑娘_9130

小芳姑娘_9130

发布时间:2026-09-02 08:49:07

|

259人浏览过

|

来源于php中文网

原创

深度分页变慢是 skip() 的固有逻辑导致,必须改用游标分页:用 _id 或排序字段作为游标,结合 $gt/$lt 和严格匹配索引实现高效分页,避免磁盘 I/O 与排序开销。

mongodb深分页查询越来越慢如何优化?

深度分页变慢不是 MongoDB 的 bug,是 skip() 本身的执行逻辑决定的——它必须逐条扫描并丢弃前 N 条文档,哪怕只返回 20 条。优化方向很明确:停用 skip(),改用游标分页。

为什么 skip() + limit() 在页码靠后时会卡住

skip(100000) 不是“跳到第 100001 条”,而是让存储引擎从头开始读、判断、丢弃前 10 万条匹配文档。这些文档若不在内存里,就会触发大量磁盘 I/O;如果查询没走索引或带 sort(),还要额外做内存排序。常见现象:db.collection.find().sort({ createdAt: -1 }).skip(50000).limit(20) 从几毫秒涨到数秒,且页码越大越慢。

必须确保排序字段有对应索引(如 { createdAt: -1 }),否则游标方案也无效。

_id 游标替代 skip() 的实操要点

_id 默认有序、唯一、自带索引,是最稳妥的游标字段。核心是“不跳,只续”:

  • 第一页:直接 db.collection.find().sort({ _id: 1 }).limit(20)
  • 后续页:取上一页最后一条的 _id 字符串(不是 ObjectId 对象),构造 { _id: { $gt: ObjectId("...") } } 查询
  • 排序方向必须和游标一致:用 $gt 就配 sort({ _id: 1 });倒序分页则用 $lt + sort({ _id: -1 })
  • 客户端必须原样保存并传回 _id 字符串(如 "65a1b2c3d4e5f67890123456"),别转成 ObjectId 再传,否则服务端可能解析失败

按业务字段(如 scorestatus)排序时怎么写游标

不能只靠 _id,否则会跨排序值漏数据。正确做法是用“排序键”本身当游标,并严格按索引顺序构造 $or 条件:

假设索引为 { status: 1, createdAt: -1 },上一页末尾文档是 { status: "active", createdAt: ISODate("2024-01-01T10:00:00Z") },下一页查询应为:

db.collection.find({
  $or: [
    { status: { $gt: "active" } },
    { status: "active", createdAt: { $lt: ISODate("2024-01-01T10:00:00Z") } }
  ]
}).sort({ status: 1, createdAt: -1 }).limit(20)

注意:$or 分支顺序必须和索引字段顺序完全一致,否则无法命中索引;每个分支都得有独立索引支撑,不能指望一个大复合索引覆盖所有 $or 组合。

事务内分页更要禁用 skip()

事务中 skip() 危害更大:它会拉长锁持有时间、暴涨内存、甚至触发 maxTransactionLockRequestTimeoutMS 超时。而且事务查询无法利用覆盖索引跳过文档读取——必须走 snapshot 隔离。

务必改用游标分页 + 严格复合索引。例如查 { status: "active", category: "electronics" } 并按 created_at 倒序,索引必须建全:{ status: 1, category: 1, created_at: -1, name: 1, price: 1 },查询时带上 created_at 游标条件,并用 explain("executionStats") 验证 totalDocsExamined === 0 才算真正走覆盖索引。

最容易被忽略的一点:游标分页不是“换了个函数就完事”,它要求前端安全传递游标值、后端严格校验格式、索引与查询条件完全对齐——少一个环节,性能就打折扣。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

695

2023.07.18

mongodb启动命令
mongodb启动命令

MongoDB 是一种开源的、基于文档的 NoSQL 数据库管理系统。本专题提供mongodb启动命令的文章,希望可以帮到大家。

2274

2023.08.08

MongoDB删除数据的方法
MongoDB删除数据的方法

MongoDB删除数据的方法有删除集合中的文档、删除整个集合、删除数据库和删除指定字段等。本专题为大家提供MongoDB相关的文章、下载、课程内容,供大家免费下载体验。

2124

2023.09.19

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4029

2023.11.02

mongodb有哪些应用领域
mongodb有哪些应用领域

mongodb 的应用领域涵盖广泛,包括内容管理系统、社交媒体、分析、移动应用、物联网、金融科技、医疗保健和广告技术等领域,因其灵活性、可扩展性和易用性而广受欢迎。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

938

2024.04.02

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6272

2024.04.02

mongodb安装失败如何彻底删除
mongodb安装失败如何彻底删除

彻底删除 mongodb 安装失败的步骤:1、停止和禁用 mongodb 服务;2、删除配置文件、数据目录和日志文件;3、删除 mongodb 二进制文件;4、卸载 mongodb 套件(如果通过软件包管理器安装);5、删除 mongodb 用户、组和目录;6、重启系统。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

575

2024.04.02

mongodb与mysql好用推荐
mongodb与mysql好用推荐

mongodb 适用于非结构化数据、高扩展性和灵活查询(如网站内容管理、社交媒体),而 mysql 适用于结构化数据、强数据一致性和联接查询(如电子商务、银行系统)。

1849

2024.04.02

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

0

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 6.2万人学习

黑马云课堂mongodb实操视频教程
黑马云课堂mongodb实操视频教程

共11课时 | 3.5万人学习

MongoDB 教程
MongoDB 教程

共42课时 | 61.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn