mysql查询某一时刻点所有用户余额

假设有一张用户资金流水表A,有以下几个字段
id, user_id, current_money, change_money, create_time

例如我需要查询2017年11月12日0点0分0秒的所有用户的余额总额,目前的逻辑就是去根据资金流水表去查询每一个用户小于这个时间点的最后一条记录,然后current_money+change_money就是该用户在这个时刻点的余额,然后根据这个去累加每个用户的余额得到总余额,但是由于用户数量有上百万,并且本身这张表数据量也非常巨大。

1.该查询是否可以用一句sql语句搞定
2.是否有更好的统计逻辑

阅读 4.8k
2 个回答

create_time,user_id加个联合索引,求总额sql如下:

select sum(current_money+change_money) all
from (select user_id,max(create_time) crt from A 
where create_time<='2017-11-12 00:00:00' group by user_id) aa
join A bb on aa.user_id=bb.user_id and aa.crt=bb.create_time;

然后就说说你的业务逻辑问题了,这种总额问题肯定是要单独的统计表来维护的,
每天的交易额,进账、出账,每次统计一天就很简单了,
总额统计逻辑:前一天的余额总额+今天的额度变化=今天的余额总额
这样的话只需要最开始全表统计一次即可,后面增量按照时间筛选统计性能不会差的,
最后就是这种交易流水表要分表的吧,按时间或者用户id分表即可,历史数据还可以另外存储

新手上路,请多包涵

单纯针对此表除了按时点、甚至做快照自己推算外,貌似并没有更好的方法,但其实系统本身应该是有个账户基表的、账户余额、类似仓库物料库存,是做分析的系统对接接口没有这么个表吗?
或者可能你现在的工作就是要根据交易记录的触发去构建这么个余额表、但是动态的所以应该是有时间键的快照。到底是什么场景的呢

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题