Server

MySQL 5.7 オプティマイザの改善〜UNION ALL〜

投稿日:2017年6月14日 更新日:

はじめに

Amazon RDSのMySQL 5.7で開発を行うことになりました。そこで、少しですがMySQL 5.7の機能を調べる機会がありましたので、今回は「UNION ALL」に関してのオプティマイザの改善について記載したいと思います。

「UNION」と「UNION ALL」の違い

先ずは、改めて「UNION」と「UNION ALL」の違いを簡単に説明しておきます。

  1. UNION
    結合対象のSELECT文の結果の全レコードを取得し、重複レコードを除去し返却します。
  2. UNION ALL
    結合対象のSELECT文の結果の全レコードををそのままつなげて返却します。

違いは結合した結果から、「重複レコードを除去するか、しないか」だけとなります。

MySQL 5.7での「UNION ALL」の改善とは

後ほど、「UNION」「UNION ALL」の実行計画の例を記載しますが、実行計画は単純であり、結合されているSELECT文を上から順に実行し、結果をつなげるだけで、「UNION」はそこから重複レコードを除去することになります。

そのため、「UNION」では重複レコードの除去のために、テンポラリーテーブルを作成し、そこで重複レコードを除去する必要がありますが、「UNION ALL」ではその必要がないので、本来はテンポラリーテーブルは不要なはずです。

しかし、MySQL5.6では、「UNION」「UNION ALL」ともにテンポラリーテーブルを作成していました。今回MySQL5.7からは、「UNION ALL」の場合は不必要にテンポラリーテーブルを作成しないようになり、パフォーマンスが改善されたということになります。

 

MySQL 5.7での実行計画

では、MySQL 5.7での「UNION」と「UNION ALL」の実行計画を見てみましょう。

下記を見ていただくとわかりますが、MySQL 5.7では「UNION ALL」の場合は、テンポラリーテーブルが作成されていませんね。なお、比較のためにMySQL 5.7でも「UNION」を使った実行例も記載します。実行計画上で、「3. row」が追加されており、重複レコードの除去のためにテンポラリーテーブルが作成されていることがわかります。

UNION ALL実行計画

UNION実行計画

 

プログラムの見直しについて

SELECT文を結合する際に、暗黙的にUNIONだけを使っていた場合は、プログラムを見直すことでパフォーマンスが改善するかもしれません。

もちろん、UNIONとUNION ALLでは結果セットが異なってきますので、下記のように問題ないことを確認して置き換えると良いと思います。

  • レコードが重複することがないので、UNION ALLを使用する
  • レコードが重複するが、結果として問題ない、もしくはプログラム側で処理するので、UNION ALLを使用する

さいごに

いかがでしたでしょうか。ちょっとしたオプティマイザの改善ではありますが、DBがパフォーマンスのボトルネックになることが多いので、こういったところでもしっかりとチューニングしていきたいですね。

blog-page_footer_336




blog-page_footer_336




-Server
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

WordPressのサーバ移設とnginxで無料SSLをやってみた

1 はじめに1.1 環境2 サーバー準備2.1 ConohaのVPSサーバーの契約2.2 sshログイン用のユーザーを作成2.3 必要なソフトウェアのインストール3 WordPressの移行3.1 D ...

aws

MyCoachの本番環境をAWS上に構築する 〜EC2編〜

1 はじめに1.1 関連記事2 MyCoachで利用しているインスタンス3 設定する項目4 キーペアの作成5 セキュリティグループの作成6 インスタンスの作成6.1 Webサーバのインスタンスを作成6 ...

aws

AWS Lambdaの関数スケーリングとローカル実行

1 はじめに2 関数スケーリングについて2.1 同時実行とは2.2 同時実行の制御方法2.3 その他3 ローカルで実行するには3.1 LocalStackについて3.2 LocalStackのSetu ...

aws

AWSのT3インスタンスの特徴

1 はじめに2 T3インスタンスとは2.1 T3インスタンスのスペック2.2 Unlimited Modeがデフォルトで有効2.3 ハイパーバイザはNitro3 T2インスタンスとの比較3.1 仮想C ...

icon

ブログ運営で最も気をつけること(障害報告)

1 お詫び2 障害報告書2.1 障害内容2.2 障害期間2.3 障害の原因2.4 障害の長期化の原因2.5 詳細3 対応3.1 決済に使用するクレジットカードを変更する3.2 一つ前のOSバージョンで ...

フォロー

blog-page_side_responsive

2017年6月
 123
45678910
11121314151617
18192021222324
252627282930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。