この記事の最終更新日: 2025年4月28日

MySQLにおけるUNION ALL
は、複数のクエリ結果をまとめて取得する際に非常に便利な機能です。特に、重複行を気にせず結果を素早く統合したい場合に強力なパフォーマンスを発揮します。本記事では、UNION ALL
の基本動作から、UNION
との違い、具体的な活用例、パフォーマンスへの影響、さらによくある失敗例とその改善策までを、丁寧に詳しく解説します。
1. UNION ALL の基本動作を理解する
1.1 UNION ALLとは?
UNION ALL
は、複数のSELECT文の結果を単純に結合するための構文です。各クエリの結果をそのまま連結し、重複行を排除せずにすべてのデータを取得します。重複チェックが行われないため、非常に高速に結果をまとめることが可能です。
1.2 基本的な書き方
SELECT col1, col2 FROM table_a
UNION ALL
SELECT col1, col2 FROM table_b;
この例では、table_a
とtable_b
から取得したデータが、重複を気にせず順番に結合されます。
1.3 UNIONとの違い
比較項目 | UNION | UNION ALL |
---|---|---|
重複行の扱い | 重複行を自動で排除 | 重複行もそのまま保持 |
パフォーマンス | 重複排除のため追加処理が必要 | 追加処理がないため高速 |
主な利用シーン | ユニークな結果が必要なとき | パフォーマンス重視・重複許容時 |
特に大規模データを扱う場面では、UNION ALL
の高速性が大きなメリットとなります。
2. 実践的な活用例
2.1 シンプルなデータ結合
SELECT user_id, name FROM current_users
UNION ALL
SELECT user_id, name FROM archived_users;
このクエリでは、現役ユーザーとアーカイブ済みユーザーの両方の情報を一括で取得します。両テーブルに同じユーザーIDが存在しても、それぞれのレコードが独立して取得されます。
2.2 条件を付けて結合する場合
SELECT user_id, name
FROM current_users
WHERE active = 1
UNION ALL
SELECT user_id, name
FROM archived_users
WHERE retired_date > '2025-01-01';
現役でアクティブなユーザーと、最近退職したユーザーをまとめて取得する例です。各テーブルで適切に条件を設定することで、無駄なデータ取得を避けられます。
3. パフォーマンスを意識した使い方
3.1 インデックスの効果
UNION ALL
では、各SELECTクエリが独立して処理されるため、それぞれのクエリでインデックスが利用されます。これにより、個別のクエリが最適なパフォーマンスを維持しやすくなります。
3.2 実行計画(EXPLAIN)の確認
クエリを最適化するためには、常に実行計画を確認しましょう。
EXPLAIN SELECT col1, col2 FROM table_a
UNION ALL
SELECT col1, col2 FROM table_b;
これにより、各SELECTのアクセスパターンやインデックスの利用状況を確認できます。必要に応じてインデックスの追加やWHERE条件の見直しを行いましょう。
4. よくある失敗例とその改善策
4.1 失敗例:重複排除が必要なのにUNION ALLを使ってしまった
SELECT email FROM subscribers
UNION ALL
SELECT email FROM newsletter_signups;
このクエリでは、同じメールアドレスが複数回取得される可能性があり、後処理が必要になる場合があります。
4.2 改善例:UNIONを正しく使う
SELECT email FROM subscribers
UNION
SELECT email FROM newsletter_signups;
このようにUNION
を使えば、SQLレベルで重複排除が行われ、取得後のデータ処理が簡素化されます。
5. 応用パターン:巨大データの分割統合
5.1 パーティションキーによる分割
SELECT * FROM big_table WHERE partition_key = 'A'
UNION ALL
SELECT * FROM big_table WHERE partition_key = 'B';
巨大なテーブルを条件ごとに分割し、別々にクエリを実行してからUNION ALL
で結合することで、処理負荷を分散できます。並列実行と組み合わせるとさらに効果的です。
5.2 並列実行との組み合わせ
ETL処理やバッチジョブでは、各SELECTを並列で実行し、結果をまとめて高速処理する手法が一般的です。データ量が膨大な場合は特に有効です。
6. まとめ
UNION ALL
は重複排除をせずに高速に結果を結合できるため、大量データ処理に適している。- 各SELECTごとにインデックスを意識したクエリを書くことが重要。
- 実行計画(EXPLAIN)を活用してパフォーマンスチューニングを行う。
- 重複を避けたい場合は
UNION
を使い分ける意識を持つ。 - 大規模データ処理では分割実行と並列化の組み合わせを検討する。
正しくUNION ALL
を使いこなせば、MySQLクエリのパフォーマンスを大幅に向上させることができます。日々の開発やデータ分析業務にぜひ取り入れてみてください。

大阪のエンジニアが書いているブログ。
コメント