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 はコンポーネント間の通信をどのように実装しますか?

推薦する

CSS で写真のスタッキング効果を実装するサンプルコード

成果を達成するステップ1. 初期index.html最初の写真、一番上の写真を作成します。写真の i...

mysql5.7.14 解凍版インストールグラフィックチュートリアル

MySQL は、コミュニティ エディション (コミュニティ サーバー) とエンタープライズ エディシ...

MySQLでテーブル名を変更する方法と注意すべき点

目次1. テーブル名を変更する方法2. 注記要約: 1. テーブル名を変更する方法RENAME TA...

Alibaba Cloud Server ドメイン名解決手順 (初心者向けチュートリアル)

ウェブサイトの構築を始めたばかりの初心者には、理解し、学ぶべきことがたくさんあります。ウェブサイトを...

インターフェースなしで Centos7 に JDK と Tomcat をデプロイするチュートリアル

1. xshell6をインストールする2. サーバー接続を作成し、ユーザー名とパスワードを入力します...

MySQL 5.7 クラスタ構成手順

目次1. サーバーAのmy.cnfファイルを変更する2. サーバーBのmy.cnfファイルを変更する...

Clickhouse Docker クラスターの展開と構成を例を使って説明します

目次前面に書かれた環境の展開Zookeeper クラスタの展開Clickhouse クラスターの展開...

Javascript配列の重複排除のいくつかの方法の詳細な説明

目次アレイ重複排除1 2層forループ(バブルソートの2層ループ記述に類似) 2 ループとインデック...

Vueカウンターの実装

目次1. カウンターの実装2. 成果を達成する1. カウンターの実装ページにカウンターを実装するだけ...

Nginx 構成検出サービスのステータスを実装する方法

1. チェックステータスモジュールがインストールされているかどうかを確認します。 [root@loc...

この記事ではCSSの組み合わせセレクターの使い方を説明します

CSS 組み合わせセレクターには、単純なセレクターのさまざまな組み合わせが含まれます。 CSS3 に...

Docker デプロイメント MySQL8 クラスター (マスター 1 台とスレーブ 2 台) の実装手順

目次1. CentOS 7.9 20にDockerをインストールする2. MySQL クラスターをデ...

MySQL マスター/スレーブ ステータスを監視するシェル スクリプト

Linuxでシェルスクリプトを共有して、MySQLのマスタースレーブ状態を監視し、エンタープライズW...

vue3 カスタムディレクティブの詳細

目次1. カスタム指示の登録1.1. グローバルカスタム指示1.2. ローカルカスタム指示2. カス...