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プロトタイプとプロトタイプチェーンについての簡単な説明

推薦する

VMware 仮想マシンでの Centos8 ブリッジの静的 IP 設定方法

1. ネットワーク接続方法がブリッジされていることを確認する物理ネットワーク接続ステータスのコピーを...

Tomcat が localhost に通常アクセスすると 404 を報告する問題の解決方法

今日、プロジェクトのホームページにアクセスするために Tomcat を設定していたところ、404 エ...

HTML ページ共通スタイル (推奨)

以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピーbody、di...

MySQLサービスの自動停止の解決策

この記事では主に、MySQL サービスの自動停止の解決策を紹介し、参考と学習のために共有します。一緒...

Vue の DOM の非同期更新の簡単な分析

目次Vue が DOM を非同期更新する原理1 実際の DOM 要素を取得できるのはいつですか? 2...

CSS3 で六角形の境界線を実装するサンプルコード

一番外側の boxF は 120 度回転し、2 番目の boxS は -60 度回転し、3 番目の ...

CSS3 パッケージ化後にプレフィックスプラグインを自動的に追加する方法の詳細な説明: autoprefixer

vue-cli で構築されたプロジェクト スキャフォールディングでは、すでに autoprefix...

ウェブデザインの初心者に役立つ学習教材をいくつかお勧めします

勉強中に読んだ本についてもよく聞かれます。以下は初心者におすすめの本です(私が勉強中に読んだ本です。...

React、Angular、Vueの3つの主要なフロントエンド技術の詳細説明

目次1. 反応する基本的な使い方注目すべき機能クラスコンポーネント仮想DOMライフサイクルメソッドJ...

503 サービス利用不可エラーの解決方法の説明

1. Webページを開くと503サービス利用不可が表示されますが、更新すると正常にアクセスできます。...

MySQL ビューの紹介と基本操作のチュートリアル

序文ビューは、データベース システム内で非常に便利なデータベース オブジェクトです。 MySQL 5...

MySQL のインストール方法と設定に関するいくつかの問題の概要

1. MySQL rpm パッケージのインストール # インストールソースをダウンロードします [r...

アイデア展開Tomcatサービス実装プロセス図

まずプロジェクトの成果物を構成するスタートアップ項目の設定 Tomcatサービスを作成する開始したい...

JavaScript を使用してセカンダリ メニューを作成する

この記事では、セカンダリメニュー効果を実現するためのJavaScriptの具体的なコードを参考までに...

Mysqlは隣接リスト(隣接リスト)を通じてツリー構造を保存します。

以下の内容では、隣接リストを使用してツリー構造を保存する MYSQL のプロセスとソリューションを紹...