MySQL 5.7 のユニオンオール使用法のブラックテクノロジーを 5 分で学ぶ

MySQL 5.7 のユニオンオール使用法のブラックテクノロジーを 5 分で学ぶ

MySQL 5.6 での union all のパフォーマンス

パート 1:MySQL 5.6.25

[root@HE1 ~]# MySQL -uroot -p
パスワードを入力してください: 
MySQL モニターへようこそ。コマンドは ; または \g で終わります。
MySQL接続IDは2です
サーバーバージョン: 5.6.25-log MySQL コミュニティサーバー (GPL)
Copyright (c) 2000, 2015, Oracle およびその関連会社。無断複写・転載を禁じます。
OracleはOracle Corporationおよびその関連会社の登録商標です。
その他の名称は各社の商標である場合があります。
所有者。
ヘルプを表示するには、「help;」または「\h」と入力します。現在の入力ステートメントをクリアするには、「\c」と入力します。
mysql> バージョンを選択します();
+------------+
| バージョン() |
+------------+
| 5.6.25-ログ |
+------------+
セット内1列(0.26秒)
  
mysql> explain (select id from helei order by id) union all (select id from t where id=0 order by id);
+----+--------------+------------+-------+---------------+---------+-------+------+-----------------+
| id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 |
+----+--------------+------------+-------+---------------+---------+-------+------+-----------------+
| 1 | PRIMARY | helei | index | NULL | idx_c1 | 4 | NULL | 5219 | インデックスを使用 |
| 2 | UNION | t | ALL | NULL | NULL | NULL | NULL | 1 | where の使用 |
| NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | 一時を使用 |
+----+--------------+------------+-------+---------------+---------+-------+------+-----------------+
セット内の 3 行 (0.00 秒)

MySQL バージョン 5.6 では、実行結果は次の図のようになります。

翻訳:

実行プランから、helei テーブルと t テーブルのクエリ結果が一時テーブルにマージされ、クライアントに出力されます。

MySQL 5.7/MariaDB 10.1 での union all のパフォーマンス

パート 1:MySQL 5.7.15

[root@HE1 ~]# mysql -uroot -p
パスワードを入力してください: 
MySQL モニターへようこそ。コマンドは ; または \g で終わります。
MySQL接続IDは8です
サーバーバージョン: 5.7.15-log MySQL コミュニティサーバー (GPL)
Copyright (c) 2000, 2016, Oracle およびその関連会社。無断複写・転載を禁じます。
OracleはOracle Corporationおよびその関連会社の登録商標です。
その他の名称は各社の商標である場合があります。
所有者。
ヘルプを表示するには、「help;」または「\h」と入力します。現在の入力ステートメントをクリアするには、「\c」と入力します。
mysql> バージョンを選択します();
+------------+
| バージョン() |
+------------+
| 5.7.15-ログ |
+------------+
セット内の1行(0.00秒)、
mysql> explain (select id from helei order by id) union all (select id from t where id=0 order by id);
+----+-------------+--------+-----------+---------+---------------+---------+--------+----------+-----------+-------------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+--------+-----------+---------+---------------+---------+--------+----------+-----------+-------------+
| 1 | PRIMARY | helei | NULL | index | NULL | idx_c1 | 4 | NULL | 5212 | 100.00 | インデックスを使用 |
| 2 | UNION | t | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | where の使用 |
+----+-------------+--------+-----------+---------+---------------+---------+--------+----------+-----------+-------------+
セットに 2 行、警告 1 件 (0.00 秒)

MySQL バージョン 5.7 では、実行結果は次の図のようになります。

翻訳:

パート 2: MariaDB 10.1.16

[root@HE3 ~]# /usr/local/mariadb/bin/mysql -uroot -S /tmp/mariadb.sock 
MariaDB モニターへようこそ。コマンドは ; または \g で終わります。
MariaDB接続IDは7です
サーバーバージョン: 10.1.16-MariaDB MariaDB サーバー
Copyright (c) 2000、2016、Oracle、MariaDB Corporation Ab およびその他。
ヘルプを表示するには、「help;」または「\h」と入力します。現在の入力ステートメントをクリアするには、「\c」と入力します。
MariaDB [(なし)]>
MariaDB [helei]> explain (select id from helei order by id) union all (select id from t where id=0 order by id);
+------+-------------+-------+-------+---------------+---------+-------+------+------------+
| id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 |
+------+-------------+-------+-------+---------------+---------+-------+------+------------+
| 1 | PRIMARY | helei | index | NULL | idx_c1 | 4 | NULL | 5198 | インデックスを使用 |
| 2 | UNION | t | ALL | NULL | NULL | NULL | NULL | 1 | where の使用 |
+------+-------------+-------+-------+---------------+---------+-------+------+------------+
セット内の 2 行 (0.00 秒)

MariaDB10.1 では、実行結果が次の図のように表示されます。

翻訳:

実行結果から、MySQL 5.7 も MariaDB 10.1 も一時テーブルを作成しないことがわかります。順番としては、まず helei テーブルのクエリ結果がクライアントに出力され、次に t テーブルのクエリ結果がクライアントに出力されます。

この記事の最適化は union all のみを対象としており、最外層の union および order by には効果がありません。次の図に示すように:

翻訳:

--要約--

MySQL 5.7/MariaDB 10.1 では、union all は一時テーブルを作成しなくなり、union クエリ中の I/O オーバーヘッドが削減されます。この機能は MySQL 5.5/5.6 では使用できません。

上記は、MySQL5.7 での union all の使用方法を理解するために 5 分で紹介したブラック テクノロジーです。お役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • MySQL で union all を使用してユニオンソートを取得する方法
  • MySQL における UNION と UNION ALL の基本的な使い方
  • MySQL の union と union all の簡単な分析
  • MySQL クエリ コマンドで or、in、union all を使用した場合の効率の比較
  • MySQL ジョイントクエリ UNION と UNION ALL の使用法の紹介
  • MySQLのunion allとunionの違いを簡単に理解する

<<:  CentOS7でPHPスケジュールタスクを実行する方法

>>:  AIX マウント NFS の書き込み効率が低い場合の解決策

推薦する

Win10 での MySQL 8.0.20 のインストールと設定のチュートリアル

Win10 システムでの MySQL 8.0.20 のインストールと設定の超詳細なチュートリアルMy...

JavaScript の async と await のシンプルで詳細な学習

目次1. はじめに2. 詳しい説明2.1、非同期2.1.1. 関数はPromise以外のオブジェクト...

Vue 2つのフィールドの共同検証によりパスワード変更機能を実現

目次1. はじめに2. ソリューションの実装2.1 実装コード2.2 コードの説明2.3 検証結果1...

Tomcat サーバーの設定と Web プロジェクトの公開に関する IDEA グラフィック チュートリアル

1. Webプロジェクトを作成したら、Tomcatを例にサーバーを構成する必要があります。 2. 実...

仮想マシンでXshell5をLinuxに接続する方法と障害の解決方法

かなり前に仮想マシンをインストールしましたが、ようやく Linux をインストールしました。マシンの...

Ubuntu 14.04 で QT5 をインストール、設定、アンインストールするための詳細な手順

1. 以前 QT5.13 バージョンをダウンロードしましたが、インストール後、Qtcreator を...

CSS テキスト配置実装コード

フォームを作成するときに、名前、携帯電話番号、出生地などの 2 つのフィールドを揃える状況に遭遇する...

Raspberry Pi 3B+ に 64 ビット Ubuntu システムと Docker ツールをインストールする詳細な手順

Raspberry Pi 3B に 64 ビット アプリケーション (64 ビット JDK など) ...

IE6 スペースバグ修正方法

コードを見てみましょう:コードをコピーコードは次のとおりです。 < !DOCTYPE html...

Spring Boot 2.4 の新機能、ワンクリックビルド、Docker イメージプロセスの詳細説明

背景開発プロセス中に Docker コンテナ化をサポートするために、通常は Maven を使用してコ...

MySQLデスクトップツールSQLyogのリソースとアクティベーション方法は、白黒のコマンドラインに別れを告げます

では、早速リソースについて見ていきましょう。 123WORDPRESS.COM ダウンロードSQLy...

Hタグはウェブページ制作において適切に使用すべきである

HTML タグには、ページのタイトルを処理するための特別なタグがあります。これらは h1、h2、h3...

EChartsマウスイベント処理方法の詳細な説明

イベントとは、クリック、マウスオーバー、ページの読み込み後にトリガーされる読み込みイベントなど、ユー...

Linuxで静的ネットワーク接続を構成する方法

Linux システムのネットワーク接続を構成するのは難しい場合があります。幸いなことに、多くの新しい...

JS は VUE コンポーネントに基づいて都市リスト効果を実装します

この記事の例では、VUEコンポーネントに基づいて都市リストエフェクトを実装するための具体的なコードを...