Open3

データベース【MySQL】

ダイチ/ daichiダイチ/ daichi

IN 句を使うときの注意点

✅ 問題点

IN 句を大量に走らせるとDBにかなり負荷がかかる

queryFormat += " AND user_code IN (?)"
args = append(args, cond.UserCodes)

✅ 理由

  • IN 句はリストを線形検索する
    • リスト全体と照合しているため
  • データ量が多いとメモリ負荷が高くなる
    • リストをメモリに保持して比較を行うため
    • リストのサイズが大きくなるほど、比較操作の回数が増えるため負荷も高くなる

✅ 対策

  • JOIN を利用する
    • リストが外部テーブルなら、IN 句よりも効率的
SELECT * 
FROM table t
JOIN another_table a ON t.column = a.id
  • 一時テーブルを利用
    • 一時テーブルを作成して、そこに値を挿入→JOIN
CREATE TEMP TABLE temp_codes (code INT);
INSERT INTO temp_codes (code) VALUES (1), (2), (3), ...;

SELECT * 
FROM table 
WHERE column IN (SELECT code FROM temp_codes);
  • EXISTS の利用
    • 効率が上がる場合がある
SELECT * 
FROM table t
WHERE EXISTS (
    SELECT 1 
    FROM another_table a 
    WHERE t.column = a.id
);
ダイチ/ daichiダイチ/ daichi

JOIN の種類の比較表

JOIN 種類 主な用途 返されるデータ
INNER JOIN 一致するデータのみ取得したい場合 両方のテーブルで一致する行
LEFT JOIN あるテーブルの全データを必ず取得し、不足部分を補完したい場合 左テーブルのすべての行と、右テーブルの一致する行
RIGHT JOIN 右側のテーブルを優先してデータを取得したい場合 右テーブルのすべての行と、左テーブルの一致する行
FULL JOIN 両方のテーブルのすべてのデータを取得し、対応するデータがない場合は NULL を埋めたい場合 両方のテーブルの全データ
CROSS JOIN すべての組み合わせを生成したい場合 両方のテーブルの直積
SELF JOIN 同じテーブル内での関係を分析したい場合 自己比較による結合

選択のポイント

  1. 条件に一致するデータのみ必要INNER JOIN
  2. 一方のテーブルを優先して全データ取得LEFT JOIN または RIGHT JOIN
  3. 両方のテーブルを包括的にカバーFULL JOIN
  4. すべての組み合わせが必要CROSS JOIN
  5. 自己参照による分析SELF JOIN