JOINの代わりにEXISTSを使用したクエリ速度の最適化
最近の開発では、特に遅いsqlに遭遇しました.
10万程度のデータテーブルでは、実行時間が1~2分かかる.このクエリの目的は、1.指定された言語タイプの下に、文章の内容があります.指定されたソース3.タグとのマッピング関係では,指定されたタグ集合に含まれる必要があるが,後にグループ内の同僚から提示され,次のような書き方に変更され,クエリ時間は元の1/10に過ぎない.
したがって、リレーショナル・テーブルを使用する必要があり、出力値を一意にする必要がある場合は、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クエリーを改善してみましょう.