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 フレームワーク スクリプト

推薦する

選択タグ内のオプションをクリアする3つの方法

方法1コードをコピーコードは次のとおりです。 document.getElementById(&qu...

Dockerボリュームマウントの実装方法

最も単純な hello world 出力イメージを作成することは最も簡単なスタートですが、実行中のコ...

Linux で MySQL をインストールする簡単な方法

Linux に MySQL をインストールする方法をオンラインで検索すると、多くの方法が表示されまし...

Cronジョブを使用してCpanelでPHPを定期的に実行する方法

cpanel 管理バックエンドを開き、「詳細」オプションの下に「Clock Guardian Job...

MySQLのスローログの開き方と保存形式の詳細な分析

開発プロジェクトでは、MySQL のスロークエリログを通じて効率の問題のある SQL を監視できます...

Mysqlトランザクション操作の失敗を解決する方法

Mysqlトランザクション操作の失敗を解決する方法トランザクションの原子性: トランザクションは、デ...

Linux QT Kit が見つからない、バージョンが空の問題の解決策

現在このような問題が発生しています 私の状況は、QT が動かなくなってしまったため、仮想マシンを再起...

CSS ですべての子要素を選択し、スタイルを追加する方法

方法:実際のプロジェクトを例に挙げてみましょう。 .lk-ツールバー{ .el-入力{ 幅: 169...

Apache クロスドメイン リソース アクセス エラーの解決策

多くの場合、大規模および中規模の Web サイトでは、静的リソース (フォント ファイル、画像など)...

MySQL データベースは何をしますか?

MySQL はリレーショナル データベース管理システムです。リレーショナル データベースは、すべて...

HTML割引価格計算の実装原理とスクリプトコード

コードをコピーコードは次のとおりです。 <!DOCTYPE HTML PUBLIC "...

CSS でフロートとマージンを混合するサンプルコード

最近の勉強で、GitHub でレイアウトの練習をいくつか見つけたのですが、レイアウトにまったく慣れて...

CSS3+JS による虫眼鏡モードの完璧な実装の詳細説明

約 1 年前、私は「虫眼鏡効果を模倣するいくつかの方法の原理の分析」という記事を書きました。当時、自...

JavaScriptプロトタイプチェーンの詳細な説明

目次1. コンストラクタとインスタンス2. プロパティプロトタイプ3. プロパティ __proto_...

シンプルなドラッグ効果を実現するjs

この記事では、簡単なドラッグ効果を実現するためのjsの具体的なコードを参考までに共有します。具体的な...