JOINの代わりにEXISTSを使用したクエリ速度の最適化


最近の開発では、特に遅いsqlに遭遇しました.
SELECT DISTINCT s.*
FROM pcom_stories s 
INNER JOIN pcom_story_content sc 
	ON s.story_id = sc.story_id AND sc.language=? 
INNER JOIN pcom_object_to_tag ot 
	ON s.story_id = ot.obj_id AND ot.obj_type=1 
WHERE 
	ot.tag_id IN ( ? , ? , ? , ? , ? , ? ) 
	AND s.fsource_id = ? 
ORDER BY s.date_time DESC 
LIMIT ?, ?

10万程度のデータテーブルでは、実行時間が1~2分かかる.このクエリの目的は、1.指定された言語タイプの下に、文章の内容があります.指定されたソース3.タグとのマッピング関係では,指定されたタグ集合に含まれる必要があるが,後にグループ内の同僚から提示され,次のような書き方に変更され,クエリ時間は元の1/10に過ぎない.
SELECT s.* 
FROM pcom_stories s 
INNER JOIN pcom_story_content sc 
	ON s.story_id = sc.story_id AND sc.language=? 
WHERE 
	EXISTS ( 
		SELECT 1 FROM pcom_object_to_tag ot 
		WHERE 
			ot.tag_id IN ( ? , ? , ? , ? , ? , ?) 
			AND s.story_id = ot.obj_id 
			AND ot.obj_type=1 
	) 
	AND s.fsource_id = ? 
ORDER BY s.date_time DESC 
LIMIT ?, ?

したがって、リレーショナル・テーブルを使用する必要があり、出力値を一意にする必要がある場合は、existsを使用してSQLクエリーを改善してみましょう.