実現したいこと
inner joinとサブクエリについて整理しています。以下2点について教えていただけると幸いです。
・まとめた理解が正しいかどうか
・INNER JOIN とサブクエリのパフォーマンスの違い
発生している問題・分からないこと
JOINSとサブクエリの違いについて
やったこと
JOINSとサブクエリをサンプルテーブルをもとにイメージを掴みました
ユースケース
workspace_id=1を持つmessagesテーブルのレコードを取得する
JOINS使用
sql
1SELECT * 2FROM messages 3INNER JOIN channels 4 ON messages.channel_id=channels.id 5WHERE channels.workspace_id=1;
サブクエリ使用
sql
1SELECT * 2FROM messages 3WHERE EXISTS ( 4 SELECT 1 5 FROM channels 6 WHERE messages.channel_id=channels.id 7 AND channels.workspace_id=1 8);
結果
どちらも同じでした。(内容も含め)
sql
131000 rows in set
JOINSとサブクエリの出力の違い
最終的に出力されるカラムの量が違うとの認識です。
- JOINS :当然結合したテーブル(カラム)全て出力される
- サブクエリ:サブクエリ内で指定したテーブル(カラム)はあくまで「参照」、出力されない
サブクエリのイメージ
以下のクエリを実行した場合の処理の流れは以下の通り
sql
1SELECT * 2FROM messages 3WHERE EXISTS ( 4 SELECT 1 5 FROM channels 6 WHERE messages.channel_id=channels.id 7 AND channels.workspace_id=1 8);
該当のソースコード
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
INNER JOIN とサブクエリのパフォーマンスについて調べたところ以下の優先順位が良いとのことでした。
- INNER JOIN (最も高速なケースが多い)
- サブクエリでの事前絞り込み(大規模データの場合に有効)
3. LEFT JOIN + WHERE(通常は最も遅い)
ですが、結合するテーブルが多くなるとその分パフォーマンスが落ち、サブクエリのように余計なテーブルを結合しなくて済むのはパフォーマンス向上につながると思っています。
ケースにより違うとは思いますがパフォーマンスについてどう考えるべきか教えていただければと思います
参考記事
https://zenn.dev/btc/articles/241227_mysql_vs_inner_left_join_sub_query
https://qiita.com/yoshiokatsuneo@github/items/1b0c283c93604323c88d
https://www.okb-shelf.work/entry/subquery_left_join
補足
特になし

回答2件
あなたの回答
tips
プレビュー