鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)/ mysql查詢某一時(shí)刻點(diǎn)所有用戶余額

mysql查詢某一時(shí)刻點(diǎn)所有用戶余額

假設(shè)有一張用戶資金流水表A,有以下幾個(gè)字段
id, user_id, current_money, change_money, create_time

例如我需要查詢2017年11月12日0點(diǎn)0分0秒的所有用戶的余額總額,目前的邏輯就是去根據(jù)資金流水表去查詢每一個(gè)用戶小于這個(gè)時(shí)間點(diǎn)的最后一條記錄,然后current_money+change_money就是該用戶在這個(gè)時(shí)刻點(diǎn)的余額,然后根據(jù)這個(gè)去累加每個(gè)用戶的余額得到總余額,但是由于用戶數(shù)量有上百萬(wàn),并且本身這張表數(shù)據(jù)量也非常巨大。

1.該查詢是否可以用一句sql語(yǔ)句搞定
2.是否有更好的統(tǒng)計(jì)邏輯

回答
編輯回答
雨萌萌

create_time,user_id加個(gè)聯(lián)合索引,求總額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;

然后就說(shuō)說(shuō)你的業(yè)務(wù)邏輯問(wèn)題了,這種總額問(wèn)題肯定是要單獨(dú)的統(tǒng)計(jì)表來(lái)維護(hù)的,
每天的交易額,進(jìn)賬、出賬,每次統(tǒng)計(jì)一天就很簡(jiǎn)單了,
總額統(tǒng)計(jì)邏輯:前一天的余額總額+今天的額度變化=今天的余額總額
這樣的話只需要最開(kāi)始全表統(tǒng)計(jì)一次即可,后面增量按照時(shí)間篩選統(tǒng)計(jì)性能不會(huì)差的,
最后就是這種交易流水表要分表的吧,按時(shí)間或者用戶id分表即可,歷史數(shù)據(jù)還可以另外存儲(chǔ)

2018年7月27日 00:58
編輯回答
野橘

單純針對(duì)此表除了按時(shí)點(diǎn)、甚至做快照自己推算外,貌似并沒(méi)有更好的方法,但其實(shí)系統(tǒng)本身應(yīng)該是有個(gè)賬戶基表的、賬戶余額、類(lèi)似倉(cāng)庫(kù)物料庫(kù)存,是做分析的系統(tǒng)對(duì)接接口沒(méi)有這么個(gè)表嗎?
或者可能你現(xiàn)在的工作就是要根據(jù)交易記錄的觸發(fā)去構(gòu)建這么個(gè)余額表、但是動(dòng)態(tài)的所以應(yīng)該是有時(shí)間鍵的快照。到底是什么場(chǎng)景的呢

2017年6月4日 10:49