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 上做索引
都是innodb的表,要加什么索引?全文不行,唯一也不行
这个直接报错了 Invalid use of group function
那你就把 sum(user_logcredit.Commission) 在字段列表处写一遍
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 这条语句快了一秒
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
首先不好意思,最近上班非常非常的忙,一直没空登录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优化的一些东东,我这里有份文档,需要的话可以联系我,我给你一份。
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 上做索引
这个直接报错了 Invalid use of group function
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
这条语句快了一秒
我们又没有你的现场,只能你去做呀
user_logcredit.UserID
user_session.UserID
user_session.addtime
user_logcredit.Commission
这边都加索引 。
加索引跟innodb无关,全文索引和字段索引不一样,虽然都是索引就吃饭和喝水,都是到肚子里,一样么。。
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
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优化的一些东东,我这里有份文档,需要的话可以联系我,我给你一份。