mongo 分页优化问题求教 - V2EX
a627795061

mongo 分页优化问题求教

  •  
  •   a627795061 Mar 1, 2020 via iPhone 8497 views
    This topic created in 2264 days ago, the information mentioned may be changed or developed.
    看到 mongodb 的 skip 数据量大后会慢,如果排序字段是 id,或者是以时间排序,排序字段值唯一可以用 find 代替 skip。但如果我的排序字段不是 id 甚至字段值不唯一呢,怎么能用 find 代替 skip 分页?那还是绕不开 skip 吗?
    8 replies    2020-03-02 11:12:46 +08:00
    a627795061
        2
    a627795061  
    OP
       Mar 1, 2020 via iPhone
    @lbfeng 老哥,你这个方案就是我说的 find 代替 skip,但前提是用 id 排序,但我的问题是不是 id 排序的情况下,而且排序字段的值有可能相等
    Vegetable
        3
    Vegetable  
       Mar 1, 2020
    这个不是 mongodb 的问题,mysql 用 offset limit 在 offset 够大的时候一样要面对这个问题,这个逻辑本身没有通用的解决办法。你想知道某个排序条件下第 10000 个到 10010 个记录分别是谁,必须要先把前 9999 条记录都排出来。
    从你的描述可以看出来你应该看过官方文档的分页实现建议了,如果你的业务模型足够清晰的话,也许有办法通过别的手段优化 skip 比较大时的性能,不过这个很多时候是没那么必要的,具体还是看你业务
    a627795061
        4
    a627795061  
    OP
       Mar 1, 2020 via iPhone
    @lbfeng 老哥,你这个方案就是我说的 find 代替 skip,但前提是用 id 排序,但我的问题是不是 id 排序的情况下,而且排序字段的值有可能相等
    @Vegetable 是的,但是业务就是排序字段可以任选
    fmumu
        5
    fmumu  
       Mar 1, 2020 via Android
    限制只能查前一万条记录
    optional
        6
    optional  
       Mar 1, 2020
    如果在意性能,那就把 [不唯一] 的字段 [变唯一] 。我这边的常用操作是,线上排序不允许多字段,如果有多字段预处理为单字段, 如果有重复问题,就把该字段拆为高低 2 个部分,高位为值,低位填充随机数。
    huang7230468
        7
    huang7230468  
       Mar 1, 2020
    目前我们也是在用 mongo:
    我们主要有以下措施:
    1、条件,我们应该利用条件来尝试将尽可能的 documents 的数量减少;
    2、如果是数据非常多,几百万、几千万,那么应该考虑集群分片;
    3、重新审视目标 collection 的 Index,是否合理?
    4、甚至可以考虑 SSD ;
    最后,问下,你们目前大概是多少数据呀?如果说只有几万条,理论上讲应该不会有问题;
    itskingname
        8
    itskingname  
       Mar 2, 2020
    MongoDB 自动生成的_id 是一个排序递增的字段,可以直接通过它来搜索和分页。记录上一次的_id,第二次搜索的时候大于_id 就好了。
    About     Help     Advertise     Blog     API     FAQ     Solana     1076 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 22:44 PVG 06:44 LAX 15:44 JFK 18:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86