SQL优化:子查询->派生表->join关联

今天看到论坛有人提问,需要对语句进行优化:

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种写法的语句,性能会更好。

你可能感兴趣的:(【SQL优化】)