MySql で SQL 実行プランをクエリするために explain を使用する方法

MySql で SQL 実行プランをクエリするために explain を使用する方法

explain コマンドは、クエリ オプティマイザーがクエリの実行を決定した方法を確認する主な方法です。

この機能には制限があり、必ずしも真実を伝えるわけではありませんが、その出力は入手可能な最良の情報であり、クエリがどのように実行されるかを知ることができるため、時間をかけて理解する価値があります。

1. MySQL実行計画とは何か

実行プランをより深く理解するには、MySQL の基本構造とクエリの基本原則について基本的な理解が必要です。

MySQL 自体の機能アーキテクチャは、アプリケーション層、ロジック層、物理層の 3 つの部分に分かれています。MySQL だけでなく、他のほとんどのデータベース製品もこのアーキテクチャに従って分割されています。

アプリケーション層は主に、クライアントとのやり取り、リンクの確立、リンク ステータスの記憶、データの返却、リクエストへの応答を担当します。この層はクライアントを処理します。

ロジック層は、クエリを例にとると、主にクエリ処理、トランザクション管理、およびその他のデータベース機能処理を担当します。

クエリ SQL を受信すると、データベースはすぐにスレッドを割り当てて処理します。最初のステップでは、クエリ プロセッサが SQL クエリを最適化します。最適化後、実行プランが生成され、プラン実行者に渡されて実行されます。

プラン実行者は、データの操作のために下位のトランザクションマネージャとストレージマネージャにアクセスする必要があります。それぞれの分担は異なりますが、最終的には物理層のファイルを呼び出してクエリ構造情報を取得し、最終結果をアプリケーション層に応答します。

物理層は、実際の物理ディスクに保存されているファイル、主にデータ ファイルとログ ファイルを指します。

上記の説明から、実行プランの生成は、SQL ステートメントを実行する上で不可欠なステップであることがわかります。実行プランを表示することで、SQL ステートメントのパフォーマンスを直感的に確認できます。実行プランにはさまざまなクエリ タイプとレベルが用意されており、パフォーマンス分析の基礎として表示して使用できます。

2. 実行計画を分析する方法

MySQL には、SQL ステートメントの実行プランを直感的に表示するための explain キーワードが用意されています。

explain では、MySQL がインデックスを使用して SELECT ステートメントを処理し、テーブルを結合する方法を示します。これにより、より適切なインデックスを選択し、より最適化されたクエリ ステートメントを記述できるようになります。

次に、explain を使用して次のようにクエリを作成します。

mysql> explain select * from payment;
+----+-------------+----------+-----------+--------+---------------+-----+--------+--------+--------+--------+--------+
| id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 |
+----+-------------+----------+-----------+--------+---------------+-----+--------+--------+--------+--------+--------+
| 1 | SIMPLE | 支払い | NULL | すべて | NULL | NULL | NULL | NULL | 16086 | 100.00 | NULL |
+----+-------------+----------+-----------+--------+---------------+-----+--------+--------+--------+--------+--------+
セットに 1 行、警告 1 回 (0.01 秒)

クエリ構造には 12 個の列があります。各列の意味を理解することは、実行プランを理解する上で重要です。以下は表形式での説明です。

列名例示する
id SELECT 識別子。これは SELECT のクエリ シーケンス番号です。
選択タイプ

SELECT タイプ。次のいずれかになります。

  • SIMPLE: 単純な SELECT (UNION またはサブクエリなし)

  • PRIMARY: 最も外側のSELECT

  • UNION: UNION内の2番目以降のSELECT文

  • 依存UNION: UNION内の2番目以降のSELECT文は外側のクエリに依存します。

  • UNION RESULT: UNIONの結果

  • SUBQUERY: サブクエリの最初のSELECT

  • 依存サブクエリ: 外部クエリに依存するサブクエリの最初のSELECT

  • DERIVED: エクスポートされたテーブルのSELECT (FROM句のサブクエリ)

テーブル出力行が参照するテーブル
パーティションクエリがパーティション化されたテーブルに対するものである場合、クエリがアクセスするパーティションが表示されます。
タイプ

結合のタイプ。以下に、さまざまな結合タイプを最良から最悪の順にランク付けして示します。

  • system: テーブルには 1 つの行 (= システム テーブル) のみが含まれます。これは const join 型の特殊なケースです。

  • const: テーブルには一致する行が最大 1 つあり、クエリの開始時に読み取られます。行が 1 つしかないため、この行の列値は、オプティマイザーの残りの部分では定数とみなすことができます。 const テーブルは一度だけ読み取られるため高速です。

  • eq_ref: 前のテーブルの行の組み合わせごとに、このテーブルから行を読み取ります。これはおそらく、const 型を除いて最適な結合型です。

  • ref: 前のテーブルの行の組み合わせごとに、一致するインデックス値を持つすべての行がこのテーブルから読み取られます。

  • ref_or_null: この結合タイプは ref に似ていますが、MySQL が NULL 値を含む行を具体的に検索できる点が追加されています。

  • index_merge: この結合タイプは、インデックス マージ最適化方法が使用されることを示します。

  • unique_subquery: このタイプは、次の形式の IN サブクエリの ref を置き換えます: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery は、サブクエリを完全に置き換えることができ、より効率的なインデックス検索関数です。

  • index_subquery: この結合タイプは unique_subquery に似ています。 IN サブクエリを置き換えることができますが、次の形式のサブクエリ内の非一意のインデックスに対してのみ可能です: value IN (SELECT key_column FROM single_table WHERE some_expr)

  • range: インデックスを使用して行を選択し、指定された範囲内の行のみを取得します。

  • index: この結合タイプは、インデックス ツリーのみがスキャンされる点を除いて、ALL と同じです。通常、インデックス ファイルはデータ ファイルよりも小さいため、これは ALL よりも高速です。

  • ALL: 前のテーブルの行の組み合わせごとに完全なテーブルスキャンが実行され、クエリを最適化する必要があることを示します。

一般的に言えば、クエリが少なくとも範囲レベル、できれば参照レベルに到達するようにする必要があります。

可能なキーMySQLがこのテーブル内の行を見つけるために使用できるインデックスを示します
MySQL が実際に使用することを決定したキー (インデックス) を表示します。インデックスが選択されていない場合、キーは NULL になります。
キーの長さMySQL が使用することを決定したキーの長さを表示します。キーが NULL の場合、長さは NULL になります。長さが短いほど、精度を失わずに良くなります。
参照テーブルから行を選択するためにキーと一緒に使用される列または定数を示します。
クエリを実行するために MySQL が調べる必要があると考える行数を表示します。複数の行にわたってデータを乗算すると、処理する行数を推定できます。
フィルター条件によってフィルタリングされた行の割合の推定値を表示します。
余分な

この列には、MySQL がクエリを解決した方法に関する詳細情報が含まれています。

  • Distinct: MySQL は最初に一致する行を見つけた後、現在の行の組み合わせに対するそれ以上の行の検索を停止します。

  • 最適化されたテーブルを選択すると、MySQL はテーブルまたはインデックスをまったく走査せずにデータを返します。これは、それ以上最適化できないところまで最適化されていることを示します。

  • 存在しない: MySQL はクエリに対して LEFT JOIN 最適化を実行できます。LEFT JOIN 基準に一致する行が見つかると、テーブル内の前の行の組み合わせの行はそれ以上チェックされなくなります。

  • 各レコードの範囲がチェックされました (インデックス マップ: #): MySQL は適切なインデックスを見つけられませんでしたが、前のテーブルの列値がわかっている場合は、部分インデックスを使用できる可能性があることが分かりました。

  • filesort の使用: MySQL では、行をソート順に取得する方法を判断するために追加のパスが必要なため、クエリを最適化する必要があります。

  • インデックスの使用: 実際の行をさらに検索して読み取ることなく、インデックス ツリーの情報のみを使用してテーブルから列情報を取得します。

  • 一時テーブルの使用: クエリを解決するために、MySQL は結果を保持するための一時テーブルを作成する必要があります。つまり、クエリを最適化する必要があります。

  • where の使用: WHERE 句は、次のテーブルに一致する行やクライアントに送信される行を制限するために使用されます。

  • sort_union(...) の使用、union(...) の使用、intersect(...) の使用: これらの関数は、index_merge 結合タイプのインデックス スキャンをマージする方法を示しています。

  • グループ化にインデックスを使用する: テーブルにアクセスするためにインデックスを使用する方法と同様に、グループ化にインデックスを使用するということは、実際のテーブルにアクセスするためにハードディスクを検索する必要なく、GROUP BY または DISTINCT クエリのすべての列をクエリするために使用できるインデックスが MySQL によって検出されたことを意味します。

要約する

上記は、MySql で explain を使用して SQL の実行プランを照会する方法について紹介したものです。お役に立てば幸いです。ご質問がある場合は、メッセージを残していただければ、すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

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

<<:  JS で単一ファイルコンポーネントを実装する方法

>>:  Docker での Redis のマスタースレーブ構成チュートリアルの詳細説明

推薦する

Webデザインにおけるフォームデザインテクニックのまとめ

「脳が多数の領域間の関係を処理できるように、入力は論理的なグループに分割する必要があります。」 – ...

Node.js における非同期プログラミングの知識ポイントの詳細な説明

導入JavaScript はデフォルトでシングルスレッドであるため、コードは並列実行するための新しい...

Linux ファイル管理コマンド例の分析 [表示、閲覧、統計など]

この記事では、Linux ファイル管理コマンドについて例を挙げて説明します。ご参考までに、詳細は以下...

Node+Express テストサーバーのパフォーマンス

目次1 テスト環境1.1 サーバーハードウェア1.1.1 t2.マイクロ1.1.2 c5.large...

VMware vCenter 6.7 のインストール プロセス (グラフィック チュートリアル)

背景当初は VMware の公式 Web サイトから 6.7 Vcenter をダウンロードしたかっ...

スタックメニューを実装するためのjQueryプラグイン

jQueryプラグインの毎日の積み重ねメニュー、参考までに、具体的な内容は次のとおりです。スタックメ...

リストループスクロールを実現するための HTML+CSS+JavaScript サンプルコード

説明: 指定された時間内に前のノードのコンテンツを置き換えるタイマーを設定します。 1. キーコード...

MySQL にテーブルが存在するかどうかを確認し、それを一括で削除する方法

1. インターネットで長時間検索しましたが、判定表が存在するかどうかがわからなかったので、漠然と削除...

シンプルなショッピングフォームを実装するJavaScript

この記事では、簡単なショッピングフォームを実装するためのJavaScriptの具体的なコードを参考ま...

画像のプリロードと遅延ロードを実装するJavaScript

この記事では、JavaScriptで画像のプリロードと遅延ロードを実装するための具体的なコードを参考...

CSSにおけるマージン値と垂直マージンの重なりについて

平行ボックスの余白 (二重余白の重なり) に関する面接の質問: 1 つのボックスに上余白があり、もう...

MySQLスローログに関する知識のまとめ

目次1. スローログの紹介2. スローログの練習1. スローログの紹介スロー ログの正式名称はスロー...

React プロジェクトにおける axios カプセル化と API インターフェース管理の詳細な説明

目次序文インストール導入環境の切り替え傍受を要求するレスポンスインターセプションAPIの統合管理要約...

流れと動的なライン効果を実現する純粋なCSSコード

アイデア:外側のボックスは背景を設定し、内側のボックスは背景の幅と高さを設定し、ボックスを動かすアニ...

Vueエンジニアがカプセル化しなければならない埋め込み命令の知識のまとめ

目次序文指導の基本フック機能フック関数のパラメータ文章使い方とアイデア成し遂げる汎用性を高める要約す...