一个明细表
uid  orders  money
1    1001     10
2    1002     5
3    2001     20
2    1002     10
2    1006     5
1    1001     11一个用户表
id name
1  账三
2  李四
3  老五请问如何设计用户的统计表
比如统计表需要统计明细表中的uid和orders相同的money累加起来,如下uid orders money
1    1001   21
2    1002   15
2    1006   5
3    2001   20如果明细表的数据上几百万笔,还有几万个用户。是否考虑到分表,还是有更好的方法设计表的结构。

解决方案 »

  1.   

    这跟你的业务有关,你是实时统计还是每天统计一次?如果是实时统计的话,建议明细表每追加一条的同时就更新统计表。如果已经有明细表还没有统计表的话,就利用GROUP BY语句。
      

  2.   

    select uid ,orders, sum(money) from 明细表 group by uid,orders 
      

  3.   

    group by uid用这个肯定不行的。这么多数据。如果100万条数据都很慢了。是需要实时统计的。
      

  4.   

    采用group by uid,orders,第一次很慢,第二次很快。
    但是如果有新添加一条数据到明细表,访问效果就变成和第一次一样了。大家都是用group by 来做统计吗。
    是否还有更好的方法?
      

  5.   


    第一次很慢,第二次很快的原因是mysql有缓存,但是有新添加数据,缓存要更新就慢了。
    我说得差分更新不知道你理解了没有。举个例子:
    假如有100万条数据,通过GROUP BY生成以下统计表
    uid orders money
    1 1001 21000
    2 1002 15000
    2 1006 5000
    3 2001 20000这个时候张三订购10元
    uid orders money
    1 1001 10那么统计表就变成
    uid orders money
    1 1001 21010(21000 + 10)
    2 1002 15000
    2 1006 5000
    3 2001 20000更新语句就是,UPDATE 统计表 SET money = money + 10 WHERE uid = 1 AND orders = 1001
    不需要每次都GROUP BY