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

推薦する

vuexサードパーティパッケージを使用してデータの永続性を実装する方法

目的: vuex で管理されている状態データを同時にローカルに保存できるようにします。独自のストレー...

Centos7はMySQLログに基づいてデータを復元するためのサンプルコードを実装します

導入Binlog ログ、つまりバイナリ ログ ファイルは、データベースに対するユーザー操作の SQL...

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

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

MySQL 8.0 エラー サーバーがクライアントに不明な認証方法を要求しました 解決策

最新バージョンのMySQL 8.0.11をインストールした後、ユーザーを作成して認証します。認証され...

nginx でディレクトリ ホワイトリストと IP ホワイトリストを設定する方法

1. ディレクトリホワイトリストを設定する:指定されたリクエストパスに制限を設定しないでください。た...

CentOS7 構成 Alibaba Cloud yum ソースメソッドコード

Centos yumフォルダを開くコマンドcd /etc/yum.repos.d/を入力します。 w...

jQuery はテーブルのページング効果を実装します

この記事では、テーブルのページング効果を実現するためのjQueryの具体的なコードを参考までに紹介し...

Elimination の JavaScript ソースコード

ゲームのソースコードのダウンロードアドレスを取得するためのJavaScript:クリックしてソースコ...

MySQLのINサブクエリによってインデックスが使用できなくなる問題を解決する

今日は、MySQL IN サブクエリの最適化に関するケーススタディを見ました。最初は少し懐疑的でした...

Vue開発ウェブサイトSEO最適化方法の詳細な説明

ページデータの表示には Vue などの js のデータバインディング機構が使用されるため、クローラー...

Dockerを使用してSpring Bootプロジェクトをデプロイする手順

目次シンプルなSpringbootプロジェクトを作成する1. pom.xmlでSpring Boot...

MySQLのSQLモードの特徴のまとめ

序文SQL モードは、MySQL がサポートする SQL 構文と、実行されるデータ検証チェックに影響...

MySQL 5.7.16 無料インストール版のインストールと設定方法のグラフィックチュートリアル

この記事ではMySQL 5.7.16のインストールと設定方法を記録します。具体的な内容は以下のとおり...

JS配列の次元削減のいくつかの方法の詳細な説明

2次元配列の次元削減配列インスタンスメソッド concat と ES6 スプレッド演算子を使用した次...