MySQL実行計画の詳細な分析

MySQL実行計画の詳細な分析

序文

前回の面接では、実行計画について質問されたとき、多くの人がそれが何なのか知りませんでした。実行計画と実行時間は同じ概念だと思っている人もいました。今日は、実行計画とは何か、そしてその用途は何なのかを見てみましょう。

実行計画とは何ですか?

簡単に言えば、実行プランとは、データベースで SQL が実行されたときのパフォーマンスのことです。通常、SQL パフォーマンス分析や最適化などのシナリオで使用されます。

1. 実行計画から何がわかりますか?

  • SQL がインデックスを使用する方法
  • 結合クエリの実行順序
  • スキャンしたデータのクエリ機能

2. 実施計画の内容


SQL実行プランの出力は複数行になる場合があり、各行はデータベースオブジェクトに対する操作を表します。

1. ID列

  • ID 列のデータが数値のセットである場合、それは SELECT ステートメントが実行される順序を示します。NULL の場合、このデータ行は他の 2 つの SQL ステートメントの UNION 操作によって生成された結果セットであることを意味します。
  • ID値が同じであれば、SQL実行順序は図のように上から下になることを意味します。
  • ID値が異なる場合は、ID値が大きいほど優先度が高くなり、早く実行されます。

デモ


上記の実行プランでは 3 行の結果が返されることがわかります。id 列の値は、SQL の SELECT 操作のシーケンス番号と見なすことができます。

上記の SQL には SELECT が 1 つしかないため、すべての ID は 1 です。したがって、実行プランを上から下に読み取る必要があります。

SQL ステートメントによれば、実行順序は a、b、c で​​あると考えられますが、上の図から、Mysql は SQL に記述された順序でテーブル関連付け操作を完了しないことがわかります。

テーブルの実行順序は a、c、b です。これは、MySQL オプティマイザがテーブル内のインデックスの統計情報に基づいて、テーブル関連の実際の順序を調整するためです。

2. SELECT_TYPE列

価値意味
単純サブクエリや UNION 演算を含まないクエリ
主要なクエリにサブクエリが含まれている場合、最も外側のクエリはPRIMARYとしてマークされます。
サブクエリSELECT リスト内のサブクエリ
依存サブクエリ外部の結果に依存するサブクエリ
連合Union演算の2番目以降のクエリの値はunionである
従属連合UNIONをサブクエリとして使用する場合、2番目以降のクエリのselect_type値は
連合の結果UNIONによって生成された結果セット
派生FROM句に現れるサブクエリ

3. テーブル列

以下の結果が含まれます。

データ行が配置されているテーブルの名前を出力します。テーブルに別名がある場合は、別名が表示されます。
<union M,N>: ID MとNのユニオンをクエリして生成された結果セット
<派生 N>/<サブクエリ N>: ID N のクエリによって生成された結果

4. PARTITIONS列:

一致するレコードがどのパーティションから取得されるかを照会します。パーティション分割されたテーブルの場合は、クエリのパーティション ID を表示します。
パーティション化されていないテーブルの場合、これは NULL です。

5. タイプ列

パフォーマンスは最高から最低の順に次のようにリストされます。

価値意味
システムこれは const 結合タイプの特殊なケースであり、クエリ対象のテーブルに行が 1 つしかない場合に使用されます。
定数主キーや一意のインデックスに対するクエリなど、テーブル内に一致する行が 1 つしかない場合に使用します。これは最も効率的な結合方法です。
等価参照ユニークインデックスまたは主キーインデックスクエリ。各インデックスキーに対応し、テーブル内に一致するレコードは 1 つだけです。
参照一意でないインデックス検索。単一の値に一致するすべての行を返します。
参照またはnull ref型のクエリに似ていますが、NULL値列のクエリが追加されています。
インデックスマージこの結合タイプは、インデックス マージ最適化方法が使用されることを示します。
範囲インデックス範囲スキャンは、between、>、<などのクエリ条件でよく使用されます。
索引FULLインデックススキャン フルインデックススキャン。ALLとの違いは、インデックスツリーを走査することです。
全てFULL TABLEスキャン 最も効率の悪い結合方法であるフルテーブルスキャン

6. 追加列

MySQLがクエリを実行する方法に関する追加情報が含まれています

価値意味
明確な最初に一致する要素が見つかったら検索を停止するように、distinct 操作を最適化します。
存在しないクエリを最適化するためにnot existsを使用する
ファイルソートの使用通常は order by または group by クエリによる追加操作による並べ替え
インデックスの使用クエリにカバーインデックスを使用する
一時的な使用MySQL では、並べ替え、サブクエリ、グループ化クエリでよく使用されるクエリを処理するために一時テーブルを使用する必要があります。
where の使用データをフィルタリングするには、MySQLサーバーレベルでWHERE条件を使用する必要があります。
最適化されたテーブルを選択するテーブルにアクセスせずにインデックスを介して直接データを取得するのが、通常は最も効率的です。

7. POSSIBLE_KEYS列

MySQLがクエリを最適化するために使用できるインデックスを示します

クエリに関係する列のインデックスはリストされますが、使用されない可能性があります。

8. KEY列

クエリを最適化するためにクエリオプティマイザが実際に使用するインデックス

テーブルに利用可能なインデックスがない場合、NULLとして表示されます。

クエリでカバーリング インデックスが使用される場合、インデックスはキー列にのみ表示されます。

9. KEY_LEN列

MySQL インデックスで使用されるバイト数を表示します。結合インデックスに 3 つの列があり、3 つの列の合計長が 100 バイトの場合、Key_len は 100 バイト未満 (30 バイトなど) になることがあります。これは、クエリ中に結合インデックスのすべての列が使用されるわけではなく、最初の 1 列または 2 列のみが使用されることを意味します。

  • インデックスフィールドの最大可能長を示します
  • Key_lenの長さは、データの実際の長さではなく、フィールド定義から計算されます。

10. 参照列

キー列レコードのインデックスを使用してクエリを実行するときに、現在のテーブルで使用される列または定数を示します。

11. 行

  • MySQL がインデックス統計に基づいて推定する行数を示します (関連するクエリの場合は、ネストされたクエリごとに必要な行数が表示されます)
  • Rows の値は統計的なサンプリング結果であり、あまり正確ではありません。

12. フィルターされた列

  • 読み取られる行数に対する返される行数の割合を示します
  • フィルターされた列の値が大きいほど、より良い結果が得られます (値が大きいほど、実際に読み取られる行数が返される必要のある行数に近くなります)
  • フィルター列の値は統計情報に依存するため、あまり正確ではなく、あくまでも参考値となります。

3. 実行計画の制限

  • ストアド プロシージャ、トリガー、UDF がクエリに与える影響を表示できない
  • EXPLAIN を使用してストアド プロシージャを分析できません
  • 以前のバージョンの MySQL では、SELECT ステートメントの解析のみがサポートされていました。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

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

<<:  VMware Workstation Pro が Win10 アップデートにより開けなくなる問題の解決方法

>>:  JSプロトタイプとプロトタイプチェーンについての簡単な説明

推薦する

nginx + fastcgi を使用して画像認識サーバーを実装する

背景ディープラーニング モデルの推論には、特定のデバイスが使用されます。マシンは、モデルの読み込み、...

Vue ログインページでクッキーを使用してパスワードを 7 日間記憶する方法

問題の説明プロジェクトのログインページでは、7日間パスワードを記憶する必要がある機能があります。この...

HTML スペースコードの簡単な分析

HTML についてどれくらい知っていますか? 現在、基本的な HTML コードを学習している場合は、...

Jenkins初心者のためのDockerデプロイメントチュートリアルの詳細な説明

この記事では、docker 経由で Jenkins+Maven+SVN+Tomcat をデプロイし、...

MySQL の異常なエラー ERROR: 2002 を解決する方法

最近、MySQL の起動中にエラーが発生しました。エラー メッセージは次のとおりです。 エラー 20...

CSS3 フィルター (フィルタ) ウェブページのグレーまたは黒モードのサンプルコードを実現

フロントエンドcss3 フィルターは、Web ページのグレー効果を実現できるだけでなく、ナイト モー...

Vue実装のカウンターケース

この記事では、カウンター表示を実現するためのVueの具体的なコードを例として紹介します。具体的な内容...

Element-ui NavMenuサブメニューを使用して再帰的に生成する場合のエラーの詳細な説明

ナビゲーションバーのサブメニューを再帰的に生成すると、メニューは正常に生成できるが、マウスをホバーす...

21 の MySQL 標準化および最適化のベスト プラクティス!

序文良い習慣はすべて宝物です。この記事は、SQL の後悔の治療法、SQL パフォーマンスの最適化、S...

Docker を使用した Hadoop クラスターのデプロイに関する詳細なチュートリアル

最近、社内に Hadoop テスト クラスターを構築したいので、docker を使用して Hadoo...

CSS でハニカム/六角形アトラスを実装するためのサンプルコード

理由は分かりませんが、UIではハニカム効果(手を広げたような効果)のデザインが好まれます。 1. 六...

CSSを使用して特別なロゴやグラフィックを実装する

1. はじめに画像は多くのスペースを占め、画像の数が増えるほど管理が難しくなるため、シンプルなラベル...

モバイル署名機能を実装するJavaScript

この記事では、モバイル署名機能を実装するためのJavaScriptの具体的なコードを参考までに共有し...

Linux で scp コマンドを使用してファイルをリモートでコピーする方法の詳細な説明

序文scp は secure copy の略です。scp は、Linux システムの ssh ログイ...

Dockerコンテナの接続と通信の実装

ポート マッピングは、Docker を別のコンテナーに接続する唯一の方法ではありません。 Docke...