解决方案 »

  1.   

    select UserID
      from user_logcredit, user_session
      where 
         user_logcredit.UserID=user_session.UserID
         and user_session.addtime>'2014-5-0'
         and sum(user_logcredit.Commission)>30000
      group by user_logcredit.UserID需要在 user_logcredit.Commission 和 user_session.addtime 上做索引
      

  2.   

    都是innodb的表,要加什么索引?全文不行,唯一也不行
      

  3.   


    这个直接报错了 Invalid use of group function
      

  4.   

    那你就把 sum(user_logcredit.Commission) 在字段列表处写一遍
      

  5.   

    select user_session.userid
      from user_logcredit, user_session
      where 
         user_logcredit.UserID=user_session.userid
         and user_session.addtime>'2014-5-0'
        
       group by user_session.userid  having sum(user_logcredit.Commission)>30000
    这样写就对了   只不过时间还是有点长呀   29秒左右    select a.UserID from user_logcredit a inner join user_session b on a.userid=b.userid where from_unixtime(b.addtime)>'2014-5-0' group by a.userid having sum(a.commission)>300000
    这条语句快了一秒
      

  6.   

    你不能 EXPLAIN 看看是否有优化的地方吗?
    我们又没有你的现场,只能你去做呀
      

  7.   

    1#正解啊
    user_logcredit.UserID
    user_session.UserID
    user_session.addtime
    user_logcredit.Commission
    这边都加索引 。
    加索引跟innodb无关,全文索引和字段索引不一样,虽然都是索引就吃饭和喝水,都是到肚子里,一样么。。
      

  8.   


     select * from 
     (
     select UserID,sum(Commission) as Commission from user_logcredit 
     group by UserID
     ) a
     inner join 
     (
        select distinct(UserID) as UserID from user_session u where u.addtime>'2014-5-0')
     ) b on a.UserID=b.UserID
     where Commission>30000
      

  9.   

    首先不好意思,最近上班非常非常的忙,一直没空登录csdn ,抱歉啊。
     select UserID from user_logcredit group by UserID having sum(Commission)>30000 and UserID in 
     (select distinct(UserID) from user_session u where from_unixtime(u.addtime)>'2014-5-0');
    建议你这句话想想其他逻辑实现吧,加不加索引应该是作用不大的,即使加了也用不到,理由如下,对where条件做运算,不会用到索引。
    select UserID from user_logcredit group by UserID having sum(Commission)>30000 -- 这句话看看能否通过其他逻辑实现,得到相同的结果。
    select distinct(UserID) from user_session u where from_unixtime(u.addtime)>'2014-5-0' --- 这句话,把对addtime字段的运算去掉,直接使用addtime和变量比较(这样可以用到addtime上的索引)。
    关于那个 in 也改掉吧,使用前面的两个结果集去做Join ,效率比in高很多。关于SQL优化的一些东东,我这里有份文档,需要的话可以联系我,我给你一份。