V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
a627795061
V2EX  ›  MongoDB

mongo 分页优化问题求教

  •  
  •   a627795061 · 2020-03-01 09:51:31 +08:00 via iPhone · 7577 次点击
    这是一个创建于 1756 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看到 mongodb 的 skip 数据量大后会慢,如果排序字段是 id,或者是以时间排序,排序字段值唯一可以用 find 代替 skip。但如果我的排序字段不是 id 甚至字段值不唯一呢,怎么能用 find 代替 skip 分页?那还是绕不开 skip 吗?
    8 条回复    2020-03-02 11:12:46 +08:00
    a627795061
        2
    a627795061  
    OP
       2020-03-01 10:00:05 +08:00 via iPhone
    @lbfeng 老哥,你这个方案就是我说的 find 代替 skip,但前提是用 id 排序,但我的问题是不是 id 排序的情况下,而且排序字段的值有可能相等
    Vegetable
        3
    Vegetable  
       2020-03-01 10:22:23 +08:00
    这个不是 mongodb 的问题,mysql 用 offset limit 在 offset 够大的时候一样要面对这个问题,这个逻辑本身没有通用的解决办法。你想知道某个排序条件下第 10000 个到 10010 个记录分别是谁,必须要先把前 9999 条记录都排出来。
    从你的描述可以看出来你应该看过官方文档的分页实现建议了,如果你的业务模型足够清晰的话,也许有办法通过别的手段优化 skip 比较大时的性能,不过这个很多时候是没那么必要的,具体还是看你业务
    a627795061
        4
    a627795061  
    OP
       2020-03-01 10:27:10 +08:00 via iPhone
    @lbfeng 老哥,你这个方案就是我说的 find 代替 skip,但前提是用 id 排序,但我的问题是不是 id 排序的情况下,而且排序字段的值有可能相等
    @Vegetable 是的,但是业务就是排序字段可以任选🤨
    fmumu
        5
    fmumu  
       2020-03-01 11:42:37 +08:00 via Android
    限制只能查前一万条记录
    optional
        6
    optional  
       2020-03-01 11:56:30 +08:00
    如果在意性能,那就把 [不唯一] 的字段 [变唯一] 。我这边的常用操作是,线上排序不允许多字段,如果有多字段预处理为单字段, 如果有重复问题,就把该字段拆为高低 2 个部分,高位为值,低位填充随机数。
    huang7230468
        7
    huang7230468  
       2020-03-01 16:46:14 +08:00
    目前我们也是在用 mongo:
    我们主要有以下措施:
    1、条件,我们应该利用条件来尝试将尽可能的 documents 的数量减少;
    2、如果是数据非常多,几百万、几千万,那么应该考虑集群分片;
    3、重新审视目标 collection 的 Index,是否合理?
    4、甚至可以考虑 SSD ;
    最后,问下,你们目前大概是多少数据呀?如果说只有几万条,理论上讲应该不会有问题;
    itskingname
        8
    itskingname  
       2020-03-02 11:12:45 +08:00
    MongoDB 自动生成的_id 是一个排序递增的字段,可以直接通过它来搜索和分页。记录上一次的_id,第二次搜索的时候大于_id 就好了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2750 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:19 · PVG 22:19 · LAX 06:19 · JFK 09:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.