mysql group by 千万_千万数据 group by,union,group by能否做到秒查?

题主给的信息加上评论中的补充其实已经很充分。如果可以选择列式数据库,并配以合适的分区机制(不需要索引),5秒之内可以应该可以返回结果。我们可以精确的计算一下。

假设数据集为10个,每个数据集数据量200W。查询实际上只需要用到3个字段,data_time, userId, provin三个字段。每个字段需要占用的字节数为4,32, 4 (province可以用category或枚举类型编码)。一个数据集200万行需要80M左右的数据,列数数据库达到25%左右的压缩比例一般都没什么问题,所以一个数据相关字段占用的磁盘空间大概是20M。10个数据集大概涉及到200M的磁盘数据读取。

query需要的时间取决于计算和IO的并行化程度。一个中档的服务器,12~24个core,24~48个线程基本上是标配,所以计算的并行化没有问题。IO的并行化主要取决于硬件以及数据库的分区机制。最糟糕的情况所有数据集共享单个hdd硬盘,比较理想的情况有5-10个硬盘做了至少raid1的配置,或者列式数据库能把不同分区分散到不同的磁盘上。我们假设磁盘理论读的速度是150M-200M每秒。最糟糕的情况下,200兆数据读取(一个好的列数据库应该能够避免多线程的磁盘竞争)可以在2~3秒内完成,比较理想的情况能在0.5~1秒左右完成。

计算部分可以分为两个阶段。第一阶段,并行计算10个数据集按用户id的分组统计。第二阶段,合并每个计算集的结果,再按userId进行分组统计。这两步都可以在内存中完成,计算部分的时间取决于unique userId的个数,个数越多,耗时越高。但对列式数据库而言,每一步基本可以在0.2~1秒之间完成。

综上,比较差的情况,可以在5秒左右完成,比较理想的情况可以在1秒多一点完成。上面提到的分区方法,压缩机制,10个数据集第一步的并行计算,归并后数据在内存中分组计算至少在DolphinDB中都可以完成。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值