KDOC 392: 絞ってから関連レコードを取得してパフォーマンスを改善する

この文書のステータス

  • 作成
    • 2025-06-24 貴島
  • レビュー
    • 2025-06-26 貴島

概要

大量にJOIN先があるようなレコードを取得する場合、先にWHEREなどで件数を減らしてからJOINするとよい。

SELECT *
FROM orders o
JOIN (
  SELECT id
  FROM users
  WHERE region = '東京'
) c ON o.customer_id = u.id;

この方法は件数を減らせる条件として使えるフィールドが、少ないテーブルに集まっている必要がある。条件判定用の値は1つのテーブルに集まり、表示用の値は複数のテーブルから集めてくる、というようなケースに使える。

ORMはよく Preload として機能を用意している。関連データを別クエリで取得する。返すデータとして必要な関連データだけを得やすい。

逆に、検索条件に関連データを使いたい場合はよく Joins を用意している。同じクエリ内でJOINするので、条件指定に関連テーブルが使える。検索して件数を絞る前に JOINするので、必要な処理は増える可能性がある。

関連

なし。