SQL最適化:サブクエリ->派生テーブル->join関連付け

1202 ワード

今日フォーラムで質問がありました.文を最適化する必要があります.
 
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番目の書き方の文は、よりパフォーマンスが向上します.
 
転載先:https://www.cnblogs.com/momogua/p/8304405.html