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で処理





![[Solved] Git Pushでエラー | error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 send-pack: unexpected disconnect while reading sideband packet Writing objects: 100% (9/9), 2.30 MiB | 4.19 MiB/s, done. Total 9 (delta 5), reused 0 (delta 0), pack-reused 0 fatal: the remote end hung up unexpectedly](https://www.yuulinux.tokyo/contents/wp-content/uploads/2024/06/GitHub-Logo-1-e1718593223403-150x150.png)