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 の書き込み効率が低い場合の解決策

推薦する

HTML スライドフローティングボールメニュー効果の実装

CSS スタイル html,本文{ 幅: 100%; 高さ: 100%; マージン: 0;パディング...

MySQL ステートメントを使用した簡単な追加、削除、変更、クエリ操作の例

この記事では、例を使用して、MySQL ステートメントを使用して、単純な追加、削除、変更、およびクエ...

ウェブページのカラーマッチングにおけるオーバーラップとソフトカラーマッチングの手法を詳しく説明

この記事には、細かい点は一切なく、カラーマッチングのテクニックをシェアするだけです。とてもシンプルで...

DockerでGit環境を構築して構成するプロセス

DockerでGit環境を構成する仕事上、Docker 環境で GitLab リポジトリを操作する必...

MySQLデータベースの増分バックアップのアイデアと方法

MySQL データベースの増分バックアップを実行するには、データベース構成ファイル /etc/my....

無効にするとフォームの入力が送信できない問題の解決方法

以前、追加と変更を一緒に記述したテストプログラムを書いたことがあります。変更が必要な場合は、フォーム...

Linux でのルーティングと仮想マシン ネットワークの設定に関する詳細なグラフィック説明

ルーティングとは何ですか?ルーティングとは、相互接続されたネットワークを介して送信元ステーションから...

JavaScript の setTimeout() の使用法の概要

目次1. はじめに2. setIntervalとsetTimeoutの違い3.タイムアウトを設定する...

Vue+Websocketはチャット機能を実装するだけです

この記事では、チャット機能を簡単に実装するためのVue+Websocketの具体的なコードを参考まで...

CSSマウスを画像の上に置いたときにマスクレイヤー効果を追加する実装

まず効果を見てみましょう: マウスを画像の上に移動すると、影の効果とテキスト/アイコンが追加されます...

etcd クラスターをデプロイするための docker-compose の実装手順

目次docker-compose.ymlを書くdocker-composeを実行するビルドステータス...

ウェブページの画像を素早く表示する方法とテクニック

1. .jpg ではなく .gif を使用します。GIF は JPG に比べてサイズが小さくなります...

Element-uiはテーブル内のセルを直接クリックして編集します

目次成果を達成する実装コード最近、会社でelementUIを使い始めたため、開発の過程でテーブルのセ...

Ubuntu 18.04 での Pycharm インストール チュートリアルの実装

方法1: Pycharmをダウンロードしてインストールするダウンロードアドレス: https://w...

Vue はシームレスなカルーセル効果を実現

この記事では、シームレスなカルーセル効果を実現するためのVueの具体的なコードを参考までに紹介します...