user表中money為使用者餘額,stream表中s_money為使用者產生的管線。理論上SUM(s_money) == money,假設故障,如何找出表中存在差異的資料?如下圖 ID=3 的使用者。
補充:需要查出user表中的信息,以及該用戶的流水總和
如
ID | name | money | SUM(s_money) |
---|---|---|---|
3 | z | 150 | 100 |
嘗試分別查詢user,和stream表,透過array_diff_assoc求差集。但是效率比較低。
實測user表 23434條數據, stream表 361024條數據,總共耗時3.5s-4s。有比較有效率的方法嗎?
user表:
ID | name | money |
---|---|---|
1 | L | 50 |
2 | W | 100 |
3 | Z | 150 |
stream(流水)表:
ID | userID | s_money |
---|---|---|
1 | 1 | -50 |
2 | 1 | 100 |
3 | 2 | -10 |
4 | 2 | 110 |
5 | 3 | -10 |
6 | 3 | 110 |
目前給userID建立索引,效能翻了好幾倍,實測查詢0.3s 以內。
線上環境未測試,不懂能不能吃的消
select t1.id,t1.name,t1.money,t2.s_money from user t1,(select userID,sum(s_money) s_money from stream group by userID) t2 where t1.id=t2.userid;
可以建立聯合聯合體索引效果會更好:create index INX_stream_us on stream (user_id,s_money);