EXISTSとINは場合によって使い分ける。
間違うと遅くなる…🐱
もくじ
結論として
- 従属表の選択性が高い場合 → 従属表から先に絞り込むIN
- 従属表の選択性が低い場合 → 主表から先に絞り込むEXISTS
- 両方の選択性が低い場合 → EXISTS
本の検索による例
世界の本のデータベース
bookを主表、book_categoryを従属表とする
主表 bookテーブル
book_id | 名前 | 発売年 | 販売数 |
1 | ねこさんと一緒 | 1990 | 100000 |
・・・ |
従属表 book_categoryテーブル
book_category_id | book_id | 大カテゴリ | 小カテゴリ |
1 | 1 | 技術 | it |
2 | 20 | 料理 | 節約レシピ |
・・・ |
EXISTSとINで書いてみる
2001年に100万冊以上売れた本で技術の本でないもの
EXISTSで書いた
SELECT books.book_id FROM books WHERE books.発売年 = 1990 AND books.発売数 > 1000000 EXISTS ( SELECT 1 FROM book_category WHERE books.book_id = book_category.book_id AND book_category <> 技術 );
主表を絞りこんでから従属表の検索をかける形になる
INで書いたもの
SELECT books.book_id FROM books WHERE books.book_id IN ( SELECT book_category.book_id FROM book_category WHERE book_category <> 技術 ) AND books.発売年 = 1990 AND books.発売数 > 1000000;
従属表で絞ってから主表を検索する形になる
2001年に100万冊以上売れた本技術の本でないもの
- 2001年に100万冊以上売れた本(主表)
2001年に → 選択性 低
100万冊以上売れた本 → 選択性 高 - 技術の本でないもの(従属表)
→選択性 低
従属表の選択性が低いのでEXISTSを採用🐱
他の例
100万冊以上売れた本かつ技術の本
- 100万冊売れた本 → 選択性 高
- 技術のカテゴリー → 選択性 低
→
従属表をEXISTSで処理
2000年に発売した本でおせち料理の本
- 2000年に発売した本 → 選択性 低
- おせち料理の本 → 選択性 高
→
従属表をINで処理