单张 mongo 表记录上亿条,需要根据时间正序查询出来,没有任何条件,使用 Java 来操作,性能如何把控 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
alienx717
V2EX    MongoDB

单张 mongo 表记录上亿条,需要根据时间正序查询出来,没有任何条件,使用 Java 来操作,性能如何把控

  •  
  •   alienx717 2019-02-18 11:23:27 +08:00 11262 次点击
    这是一个创建于 2438 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前想到的是用批量的方式,就是分页的那种操作来查,还有什么好的思路么。
    23 条回复    2019-02-19 13:09:42 +08:00
    Ehco1996
        1
    Ehco1996  
       2019-02-18 11:49:23 +08:00
    有 index?没有就加,但感觉就算加了也扛不住
    全部 dump 进 es?

    楼下大牛来出个好主意吧
    lhx2008
        2
    lhx2008  
       2019-02-18 11:51:24 +08:00
    在 mongo 内部聚合,或者导出用别的软件做聚合,直接查出来不现实,前端也不需要
    rrfeng
        3
    rrfeng  
       2019-02-18 11:52:49 +08:00 via Android
    没看懂查询是什么意思,建议仔细描述。

    只按一个字段(时间)顺序查的话性能不会有任何问题。
    Caskia
        4
    Caskia  
       2019-02-18 11:53:10 +08:00
    没有分页?前端直接展示上亿?
    如果有分页,时间加 index 没问题啊.
    zxxufo008
        5
    zxxufo008  
       2019-02-18 11:56:04 +08:00
    MongoDB 本身的 ObjectId 是能获取时间戳的,按时间查询没什么问题
    wysnylc
        6
    wysnylc  
       2019-02-18 11:57:33 +08:00
    跟 java 没有什么关系,java 能做的就一个查询分页参数
    问题在 mongo
    Inside
        7
    Inside  
       2019-02-18 12:34:01 +08:00
    假设一条记录 5k 大小,1 亿条就是 500G,确定内存、带宽真的够?
    分页是必选项。
    Debiancc
        8
    Debiancc  
       2019-02-18 12:50:45 +08:00
    全部查询出来不太现实,如果想做 aggregation 可以直接压到 mongo 上,MongoDB MapReduce 了解一下。
    alienx717
        9
    alienx717  
    OP
       2019-02-18 13:49:23 +08:00
    @Ehco1996 @Caskia @Debiancc @Inside @lhx2008 @rrfeng @wysnylc @zxxufo008
    是这样的,没有前端页面的需求,这个功能可能只用一次,也不需要聚合,时间字段已经有 index 了。
    需求是需要把 mongo 表中的历史数据逐一发送到一个指定的服务器上,使用 mina 做的发送这块已经搞定了,问题是数据量太大,读取发送程序和 mongo 都在同一个服务器上。
    我目前想的是按照分页的方式批量查询出来然后逐一发走,发完再按照分页的方式继续查,不知道我这样是不是想的太简单了。没发送一条会往 redis 中做一个记录(存一个时间),一旦程序崩了,再次启动时先去 redis 里面找看看有没有内容,如果有,把那个时间拿出来,这时候就要加上查询条件了,把大于这个时间的内容分页查出来,再操作。
    Debiancc
        10
    Debiancc  
       2019-02-18 14:03:31 +08:00
    如果只是数据搬砖,可以找找生态系统里面配套的迁移工具。先迁移过去,再清洗。
    如果消费端不可控,建议做 Queue。这个数据量还要逐一发送,不做容错有点难受。
    alienx717
        11
    alienx717  
    OP
       2019-02-18 14:07:53 +08:00
    @Debiancc 因为对方只能发送 tcp 自定义的报文,其他的方式不行。
    Debiancc
        12
    Debiancc  
       2019-02-18 14:16:27 +08:00
    @alienx717 用游标吧,无限 Next。当进入 Exception,记录下当下的 criteria。下次重启继续撸,但这样并行支持不太友好。
    atonku
        13
    atonku  
       2019-02-18 16:57:27 +08:00
    删库,跑路
    snoopyxdy1
        14
    snoopyxdy1  
       2019-02-18 17:45:18 +08:00
    coloz
        15
    coloz  
       2019-02-18 20:27:53 +08:00
    类似需求,正在考虑用个时序数据库配合
    xuanbg
        16
    xuanbg  
       2019-02-18 20:33:27 +08:00
    全部查出来根本不现实。。。磁盘 IO 太高,直接崩溃,根本都轮不到网络传输数据,前端展示数据。
    luozic
        17
    luozic  
       2019-02-18 22:50:24 +08:00 via iPhone
    一亿条,还按时间,不上时间序列,你准备花多少钱配置啥样的 mDB ? 如果不是硬件堆到极致的情况下,还用垃圾方案,脑子疼不疼。
    0987363
        18
    0987363  
       2019-02-19 00:38:28 +08:00 via Android
    1 亿不算多吧,又有索引,用 iter 依次读,然后发过去,存个时间戳,挂了再从最后一个时间戳开始读
    tairan2006
        19
    tairan2006  
       2019-02-19 00:48:00 +08:00
    有索引直接读啊,这有啥难的…至于算不算多,Mongo 不是可以分布式么…
    alienx717
        20
    alienx717  
    OP
       2019-02-19 09:36:01 +08:00
    @Debiancc @snoopyxdy1
    @luozic @xuanbg 不是一次全部查出来,也不用展示
    alienx717
        21
    alienx717  
    OP
       2019-02-19 09:38:52 +08:00
    @xuanbg 我的意思是不是一下全部查出来
    vmskipper
        22
    vmskipper  
       2019-02-19 12:12:14 +08:00
    没有任何条件 就用主键遍历 利用分治思路 splitVector 命令根据 key 做 range 一个线程一个 range,速度很快的
    waibunleung
        23
    waibunleung  
       2019-02-19 13:09:42 +08:00
    @Inside 5k 太大了吧?这个假设感觉不是很到位
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5877 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 03:25 PVG 11:25 LAX 20:25 JFK 23:25
    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