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;
Union 인덱싱 효과가 더 좋아집니다. 스트림(user_id,s_money)에 INX_stream_us 인덱스를 생성합니다.