EXPLAIN を使って MySQL の SQL 実行プランを分析する方法

EXPLAIN を使って MySQL の SQL 実行プランを分析する方法


序文

MySQL では、EXPLAIN コマンドを使用して、テーブルの接続方法や SELECT ステートメントの実行中にテーブルが接続される順序など、MySQL が SELECT ステートメントを実行する方法に関する情報を取得できます。

EXPLAIN コマンドの結果の各列について次に説明します。

.select_type: SELECT のタイプを示します。一般的な値は次のとおりです。

タイプ例示する
単純シンプルなテーブル、テーブル結合やサブクエリなし
主要なメインクエリ、つまり外部クエリ
連合UNIONの2番目以降のクエリ
サブクエリサブクエリの最初のもの

.table:出力結果セットのテーブル(テーブルエイリアス)

.type: MySQL がテーブル内の必要な行を見つける方法、またはアクセス タイプを示します。一般的なアクセス タイプは上から下へ、パフォーマンスは最悪から最高の順で次のようになります。


全て完全なテーブルスキャン
索引インデックスフルスキャン
範囲インデックス範囲スキャン
参照非一意インデックススキャン
等価参照ユニークインデックススキャン
定数、システム1つのテーブルに一致する行は最大で1つです
NULLテーブルやインデックスのスキャンは不要

1. type=ALL、フルテーブルスキャン、MySQLはテーブル全体を走査して一致する行を検索します

通常、where条件は存在しないか、where条件はインデックスクエリステートメントを使用しません。

EXPLAIN SELECT * FROM customer WHERE active=0; 

2. type=index、インデックスフルスキャン、MySQLは一致する行をクエリするためにインデックス全体を走査し、テーブルをスキャンしません。

通常、クエリ フィールドはインデックス化されます。

EXPLAIN SELECT store_id FROM customer;

3. type=range、インデックス範囲スキャン、<、<=、>、>=、between などの操作によく使用されます。

EXPLAIN SELECT * FROM customer WHERE customer_id>=10 AND customer_id<=20; 

この場合、比較されるフィールドにはインデックスが付けられている必要があることに注意してください。インデックスがない場合、MySQL はテーブル全体のスキャンを実行します。たとえば、次の場合、create_date フィールドにはインデックスが付けられていません。

EXPLAIN SELECT * FROM customer WHERE create_date>='2006-02-13'; 

4. type=ref、非一意インデックスまたは一意インデックスのプレフィックススキャンを使用して、単一の値に一致する行を返します。

store_idフィールドには通常のインデックス(非一意のインデックス)があります

EXPLAIN SELECT * FROM customer WHERE store_id=10; 

Ref 型は結合操作でもよく使用されます。

関連フィールドcustomer.customer_id (主キー) とpayment.customer_id (一意でないインデックス) を使用して、顧客テーブルと支払いテーブルをクエリします。テーブルの関連付けをクエリする場合、1 つのテーブルを完全にスキャンする必要があります。このテーブルは、テーブルの中でレコード行数が最も少ないテーブルである必要があります。次に、テーブルを関連付けるときにスキャンされる行数が最小になるように、非一意のインデックスを通じて他の関連付けられたテーブル内の一致する行が検索されます。

顧客テーブルと支払いテーブルでは、顧客テーブルの行数が最も少ないため、顧客テーブルは完全にスキャンされ、支払いテーブルは一意でないインデックスを通じて一致する行を検索します。

EXPLAIN SELECT * FROM customer customer INNER JOIN payment payment ON customer.customer_id = payment.customer_id; 

5. type=eq_ref、ref と似ていますが、使用されるインデックスは一意のインデックスです。各インデックス キー値に対して、テーブル内に一致するレコードは 1 つだけです。

eq_ref は通常、複数のテーブルが結合され、主キーまたは一意のインデックスが結合条件として使用されるときに表示されます。

film テーブルと film_text テーブルの関連付けクエリは、関連付け条件が非一意のインデックスから主キーに変更されることを除いて、基本的に前の項目で説明したものと同じです。

EXPLAIN SELECT * FROM film film INNER JOIN film_text film_text ON film.film_id = film_text.film_id; 

6. type=const/system: 単一のテーブルに一致する行は最大で 1 つあり、クエリは非常に高速であるため、この一致する行の他の列の値は、現在のクエリのオプティマイザーによって定数として扱うことができます。

const/system は主キーまたは一意のインデックスに基づくクエリに表示されます。

主キーに基づくクエリ:

EXPLAIN SELECT * FROM customer WHERE customer_id =10; 

一意のインデックスに基づくクエリ:

EXPLAIN SELECT * FROM customer WHERE email = '[email protected]'; 

7. type=NULL の場合、MySQL はテーブルやインデックスにアクセスせずに結果を直接取得できます。

.possible_keys:クエリに使用できるインデックスを示します

.key:実際に使用されたインデックス

.key_len:使用されるインデックスフィールドの長さ

.ref:テーブルから行を選択するためにキーと一緒に使用する列または定数。

.rows:スキャンされた行数

.filtered:ストレージ エンジンによって返されたデータがサーバー レベルでフィルター処理された後、クエリを満たすレコードの数の割合。

.Extra:実行の説明と説明。他の列に表示するには適さないが、実行計画にとって非常に重要な追加情報を含みます。

最も重要なのは次の 3 つです。


インデックスの使用インデックス カバレッジを示します。テーブル クエリは実行されません。
Whereの使用テーブルクエリが実行されたことを示します
インデックス条件の使用ICP最適化が実行されたことを示します
Flesortの使用MySQL では追加のソート操作が必要であり、インデックス順序によるソート効果を実現できないことを示します。

ICP とは何ですか?

MySQL 5.6 では、クエリをさらに最適化するために Index Condition Pushdown (ICP) 機能が導入されました。プッシュダウンとは、操作が分散されることを意味し、場合によっては、条件付きフィルタリング操作がストレージ エンジンに分散されます。

EXPLAIN SELECT * FROM rental WHERE rental_date='2005-05-25' AND customer_id>=300 AND customer_id<=400;

バージョン 5.6 より前:

オプティマイザーは、最初に複合インデックス idx_rental_date を使用して、条件rental_date='2005-05-25'を満たすレコードをフィルター処理し、次にテーブルに戻って複合インデックス idx_rental_date に基づいてレコードを取得し、最後に条件customer_id>=300 AND customer_id<=400 (サービス レイヤーで完了) に基づいて最終クエリ結果をフィルター処理します。

バージョン5.6以降:

MySQL は ICP を使用してクエリをさらに最適化します。取得中に、条件customer_id>=300 AND customer_id<=400もストレージ エンジン レイヤーにプッシュされ、フィルタリングが完了します。これにより、不要な IO アクセスを削減できます。 Extra がUsing index condition場合、ICP 最適化が使用されていることを意味します。

参照する

MySQL を簡単に説明すると

要約する

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

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

<<:  FileZilla を使用して FTP ファイル サービスを素早く構築する方法

>>:  Vue はコンポーネント間の通信をどのように実装しますか?

推薦する

mysqlは時間を自動的に追加し、時間を自動的に追加および更新する操作を実装します

時間フィールドは、データベースの使用時によく使用されます。よく使われるのは作成時間と更新時間です。し...

JavaScript を学ぶときに知っておくべき 3 つのヒント

目次1. 魔法の拡張演算子1. 配列をコピーする2. 配列を結合する3. オブジェクトを展開する2....

VMware Tools を最初からインストールするための詳細な手順 (グラフィック チュートリアル)

VMware Tools は VMware 仮想マシンに付属するツールで、VirtualBox (...

Vue コンポーネント化の一般的な方法: コンポーネント値の転送と通信

関連する知識ポイント親コンポーネントから子コンポーネントに値を渡す子コンポーネントから親コンポーネン...

シンプルで簡単なJavaScript開発のためのSvelte実装原理の詳細な説明

目次デモ1フラグメントの作成スヴェルトコンポーネント状態を変更できるデモSvelte は長い間存在し...

写真とテキストによる MySQL と sqlyog のインストール チュートリアル

1. MySQL 1.1 MySQLのインストールmysql-5.5.27-winx64 ダウンロー...

MySQL 5.7 のインストールと設定方法のグラフィックチュートリアル

このチュートリアルでは、MySQL 5.7のインストールと設定方法を参考までに紹介します。具体的な内...

Dockerバッチコンテナオーケストレーションの実装

導入Dockerfile ビルドの実行は、単一のコンテナの手動操作です。マイクロサービス アーキテク...

Mysql で自動増分主キー ID を更新するときに問題が発生しました

目次自動インクリメント ID を更新する理由は何ですか?質問解決方法これは私が知っている問題ですが、...

LinuxにMySQLをインストールするための詳細なチュートリアル

すべてのプラットフォーム用の MySQL ダウンロードは、MySQL ダウンロードから入手できます。...

プロセスのすべての情報を表示するLinuxメソッドの例

サーバー上にタスク プロセスがあります。 ps -ef | grep task を使用して表示すると...

VUE無限レベルツリーデータ構造表示の実装

目次コンポーネントの再帰呼び出しレンダリングメソッドの使用プロジェクトに取り組んでいると、左側のメニ...

CentOS7 ファイアウォールとポート関連コマンドの紹介

目次1. ファイアウォールの現在の状態を確認する2. ファイアウォールサービスを開始する3. ファイ...

MySQLステートメントを監視する方法の詳細な説明

クイックリーディングSQL ステートメントを監視する必要があるのはなぜか、監視方法と監視手段について...

SSHのssh-keygenコマンドの基本的な使い方の詳細な説明

SSH 公開鍵認証は、SSH 認証方式の 1 つです。 SSH パスワードフリーのログインは公開鍵認...