今天看到论坛有人提问,需要对语句进行优化:
select *, (select count(1) from `ol_classify` where recommend_id = u.user_id AND `Creation_time` >= 1477929600 ) count from `ol_classify` u where u.state >0 HAVING count >= 4
同表查找所有 recommend_id等于user_id的个数,然后在根据个数来筛选。
这条语句查询速度太慢了,如何优化,或者怎么写能解决这种查询问题。
(1)上面的语句是一个典型的相关子查询。
(2)这里先改为派生表子查询:
select *, o.count from `ol_classify` u inner join ( select recommend_id, count(1) count from `ol_classify` o where `Creation_time` >= 1477929600 group o.by recommend_id )o on o.recommend_id = u.user_id and o.count >= 4 where u.state >0
(3)根据业务要求,改成inner join 或者left join
select u.user_id, u.xx, u.yy, ..., count(*) as count from `ol_classify` u inner join `ol_classify` o on o.recommend_id = u.user_id and `Creation_time` >= 1477929600 where u.state >0 group by u.user_id having count>=4
相对来说,第3种写法的语句,性能会更好。