Open3
データベース【MySQL】

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
);

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

図で表したい気持ち