MySQL実行計画を学ぶ

MySQL実行計画を学ぶ

1. 実施計画の概要

実行プランとは、MySQL クエリ オプティマイザーによって最適化された後の SQL ステートメントの特定の実行方法を指します。 MySQL では、実行プランに関する関連情報を取得するための EXPLAIN ステートメントが提供されています。 EXPLAIN ステートメントは、関連するステートメントを実際に実行するのではなく、クエリ オプティマイザーを通じてステートメントを分析し、最適なクエリ ソリューションを見つけて、対応する情報を表示することに注意してください。

実行プランは通常、SQL パフォーマンス分析、最適化、その他のシナリオで使用されます。 Explain 結果を通じて、データ テーブルのクエリ順序、データ クエリ操作の操作タイプ、ヒットできるインデックス、実際にヒットするインデックス、各データ テーブルでクエリされるレコードの行数などの情報を知ることができます。

explain 実行プランは、SELECT、DELETE、INSERT、REPLACE、および UPDATE ステートメントをサポートします。通常、選択クエリ ステートメントを分析するために使用します。

2. 実行計画の実践

次のクエリ ステートメントの実行プランを簡単に見てみましょう。

mysql> explain SELECT * FROM dept_emp WHERE emp_no IN (SELECT emp_no FROM dept_emp GROUP BY emp_no HAVING COUNT(emp_no)>1);
+----+-------------+-----------+-----------+---------+-----------------+----------+---------+----------+-----------+------------+-------------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+-----------+-----------+---------+-----------------+----------+---------+----------+-----------+------------+-------------+
| 1 | PRIMARY | dept_emp | NULL | ALL | NULL | NULL | NULL | NULL | 331143 | 100.00 | where の使用 |
| 2 | サブクエリ | dept_emp | NULL | インデックス | PRIMARY、dept_no | PRIMARY | 16 | NULL | 331143 | 100.00 | インデックスを使用 |
+----+-------------+-----------+-----------+---------+-----------------+----------+---------+----------+-----------+------------+-------------+

ご覧のとおり、実行プランの結果には 12 列あります。各列の意味は次の表にまとめられています。

列名

意味

id

SELECTクエリのシーケンス識別子

選択タイプ

SELECTキーワードに対応するクエリタイプ

テーブル

使用されるテーブル名

パーティション

一致するパーティション。パーティション化されていないテーブルの場合、値はNULLです。

タイプ

テーブルアクセス方法

可能なキー

可能なインデックス

実際に使用されるインデックス

キーの長さ

選択したインデックスの長さ

参照

インデックス等価クエリを使用する場合、インデックスと比較する列または定数

読み取る行数の推定値

フィルター

テーブル条件によるフィルタリング後に保持されるレコードの割合

余分な

追加情報

実行プランの重要な列をいくつか見てみましょう。

id:

SELECT識別子。これはクエリ内の SELECT の序数です。行が他の行の結合結果を参照する場合、値は NULL になることがあります。 ID が同じ場合は実行順序は上から下になりますが、ID が異なる場合は ID 値が大きいほど優先度が高くなり、先に実行されます。

選択タイプ:

クエリのタイプ。一般的な値は次のとおりです。

  • SIMPLE: 単純なクエリ。UNION またはサブクエリは含まれません。
  • PRIMARY: クエリにサブクエリまたはその他の部分が含まれている場合、外側の SELECT は PRIMARY としてマークされます。
  • SUBQUERY: サブクエリ内の最初の SELECT。
  • UNION: UNION ステートメントでは、UNION の後に表示される SELECT。
  • DERIVED: FROM に現れるサブクエリは DERIVED としてマークされます。
  • UNION RESULT: UNION クエリの結果。

テーブル:

クエリに使用されるテーブル名を示します。各行には対応するテーブル名があります。通常のテーブルに加えて、テーブル名は次の値になることもあります。

  • <unionM,N>: この行は、ID M と N の行の UNION 結果を参照します。
  • <derivedN>: この行は、ID N のテーブルによって生成された派生テーブルの結果を参照します。 FROM 句のサブクエリから派生テーブルを作成することが可能です。
  • <subqueryN>: この行は、ID N のテーブルによって生成されたマテリアライズド サブクエリの結果を参照します。

タイプ:

クエリ実行のタイプ。クエリがどのように実行されるかを説明します。すべての値の最高から最低までの順序は次のとおりです。

システム > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

いくつかの一般的なタイプの具体的な意味は次のとおりです。

  • system: テーブルで使用されるエンジンがテーブル内の行数を正確にカウントし (MyISAM など)、テーブルに行が 1 つしかない場合、アクセス メソッドは system になります。これは const の特殊なケースです。
  • const: テーブルには一致する行が最大 1 つあり、1 つのクエリで見つけることができます。主キーまたは一意のインデックスのすべてのフィールドをクエリ条件として使用する場合によく使用されます。
  • eq_ref: 結合されたテーブルをクエリする場合、前のテーブルの行に対応する行は現在のテーブルに 1 つだけあります。これは、system と const 以外では最適な結合方法で、主キーまたは一意のインデックスのすべてのフィールドを結合条件として使用する場合によく使用されます。
  • ref: クエリ条件として共通インデックスを使用します。クエリ結果には、条件を満たす複数の行が見つかる場合があります。
  • index_merge: クエリ条件で複数のインデックスが使用される場合、インデックス マージ最適化が有効になっていることを意味します。この場合、実行プランのキー列には、使用されるインデックスがリストされます。
  • range: インデックス列に対して範囲クエリを実行します。実行プランのキー列は、使用されるインデックスを示します。
  • index: クエリはインデックス ツリー全体をトラバースします。これは ALL と似ていますが、インデックスがスキャンされ、インデックスが通常はメモリ内にあるため、より高速です。
  • ALL: テーブル全体をスキャンします。

可能なキー:

possible_keys 列は、クエリを実行するときに MySQL が使用する可能性のあるインデックスを示します。この列が NULL の場合、使用できるインデックスがないことを意味します。この場合、WHERE 句で使用されている列をチェックして、これらの列の 1 つ以上にインデックスを追加することでクエリのパフォーマンスを向上できるかどうかを確認する必要があります。

鍵:

キー列は、MySQL で実際に使用されるインデックスを示します。 NULL の場合、インデックスは使用されません。

キー長さ:

key_len 列は、MySQL で実際に使用されるインデックスの最大長を示します。結合インデックスが使用される場合、複数の列の長さの合計になる場合があります。ニーズを満たす限り、短ければ短いほど良いです。 key 列に NULL が表示される場合、key_len 列にも NULL が表示されます。

行:

行の列は、テーブルの統計と選択条件に基づいて、検索されるレコード数または読み取られる行数の概算を表します。値が小さいほど、優れています。

余分な:

この列には、MySQL がクエリを解析する方法に関する追加情報が含まれています。この情報は、MySQL がクエリを実行する方法をより正確に理解するのに役立ちます。一般的な値は次のとおりです。

  • filesort の使用: ソートには外部インデックス ソートが使用され、テーブルの内部インデックスはソートには使用されません。
  • 一時テーブルの使用: MySQL では、クエリ結果を格納するために一時テーブルを作成する必要があります。これは、ORDER BY および GROUP BY でよく使用されます。
  • インデックスの使用: クエリがカバーリング インデックスを使用し、テーブルを返す必要がないため、クエリの効率が非常に高いことを示します。
  • インデックス条件の使用: クエリ オプティマイザーがインデックス条件プッシュダウン機能を使用することを選択したことを示します。
  • where: を使用すると、クエリは条件付きフィルタリングに WHERE 句を使用することを示します。これは通常、インデックスが使用されていない場合に発生します。
  • 結合バッファの使用 (ブロックネストループ): これはテーブル結合クエリ方法です。駆動テーブルがインデックスを使用しない場合、MySQL は最初に駆動テーブルを読み取って結合バッファに格納し、次に駆動テーブルと駆動テーブルをトラバースしてクエリを実行します。

Extra 列に Using filesort または Using temporary が含まれている場合、MySQL のパフォーマンスに問題が発生する可能性があるため、可能な限り回避する必要があることに注意してください。

以上がMySQL実行計画の学習の詳細な内容です。MySQL実行計画の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL実行計画の詳細な説明
  • MySQL での実行計画の詳細分析
  • MySQL実行計画の詳細な分析
  • mysql 実行プラン ID が空である (UNION キーワード) の詳細な説明
  • EXPLAIN を使って MySQL の SQL 実行プランを分析する方法
  • MySQL での実行計画の explain コマンド例の詳細な説明
  • MySql で SQL 実行プランをクエリするために explain を使用する方法
  • MySQL 実行計画の紹介
  • MYSQL 実行プランの説明

<<:  Dockerはjenkins+mavenコード構築および展開プラットフォームを構築します

>>:  ウェブ上でチャートを描くための 9 つの優れた JavaScript フレームワーク スクリプト

推薦する

MySQL の起動時に InnoDB エンジンが無効になる問題の解決方法

問題を見つける今日、仕事中に、ローカル データベースから仮想マシン CentOS 6.6 上のデータ...

JavaScript 組み込みオブジェクトの概要

目次1. 組み込みオブジェクト2. 数学オブジェクト1. Mathオブジェクトの使用2. 指定された...

リンク更新ページと js 更新ページの使用例

1. リンクの使用方法:コードをコピーコードは次のとおりです。 <a href="j...

サブセットかどうかを判断するためのMySQLメソッドの手順

目次1. 問題2. 解決策オプション1:オプション2: 1. 問題この話は、エラーと脱落率を照会する...

自己終了XHTMLタグを書くときに注意すべきこと

XHTML の img タグはいわゆる自己終了タグであり、XML では完全に合法です。 XHTMLの...

Alibaba Cloud Docker Yum ソースを使用した Docker 17.03.2 の CentOS7 オンラインインストールの詳細説明

参照ドキュメント公式 Docker インストール ドキュメント: https://docs.dock...

MySql 8.0.16 バージョンのインストールでは、「UTF8B3」ではなく「UTF8B4」が使用されるように求められます。

MySQL 8.0.16 にインストールする場合、「UTF8B3」ではなく「UTF8B4」が使用さ...

円形/扇形メニューを2分で実装する方法を教えます(基本バージョン)

序文このプロジェクトでは円形のメニューが必要です。オンラインで検索しましたが、適切なものが見つからな...

Centos6.9 インストール Mysql5.7.18 ステップ記録

インストール手順 rpm -ivh mysql-コミュニティ-共通-5.7.18-1.el7.x86...

Element+vueを使用して開始時間と終了時間の制限を実装する

この記事の例では、Element+vueを使用して開始と終了の時間制限を実装するための具体的なコード...

Linux サーバーの状態を監視する方法

私たち、特に Linux エンジニアは毎日 Linux サーバーを扱っています。サーバーのセキュリテ...

JConsoler を使って Tomcat の JVM メモリを監視する方法を説明します

目次1. Tomcatを監視する方法2. Java独自の監視コマンド3. Tomcatのトラブルシュ...

Mysqlアカウント管理の原理と実装方法の詳細な説明

この記事では、例を使用して、MySQL アカウント管理の原則と実装方法を説明します。ご参考までに、詳...

強くお勧めします! Vue 3.2 でシンタックスシュガーを設定する

目次前の1. セットアップ構文シュガーとは何か2. セットアップコンポーネントを使用して自動的に登録...

CentOS 7.5 に Python 3.6.6 を最初からインストールするための詳細なチュートリアル

ps: 環境はタイトル通りです依存関係をインストールする yum インストール openssl-de...