序文 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 を応援していただきありがとうございます。
<<: FileZilla を使用して FTP ファイル サービスを素早く構築する方法
>>: Vue はコンポーネント間の通信をどのように実装しますか?
時間フィールドは、データベースの使用時によく使用されます。よく使われるのは作成時間と更新時間です。し...
目次1. 魔法の拡張演算子1. 配列をコピーする2. 配列を結合する3. オブジェクトを展開する2....
VMware Tools は VMware 仮想マシンに付属するツールで、VirtualBox (...
関連する知識ポイント親コンポーネントから子コンポーネントに値を渡す子コンポーネントから親コンポーネン...
目次デモ1フラグメントの作成スヴェルトコンポーネント状態を変更できるデモSvelte は長い間存在し...
1. MySQL 1.1 MySQLのインストールmysql-5.5.27-winx64 ダウンロー...
このチュートリアルでは、MySQL 5.7のインストールと設定方法を参考までに紹介します。具体的な内...
導入Dockerfile ビルドの実行は、単一のコンテナの手動操作です。マイクロサービス アーキテク...
目次自動インクリメント ID を更新する理由は何ですか?質問解決方法これは私が知っている問題ですが、...
すべてのプラットフォーム用の MySQL ダウンロードは、MySQL ダウンロードから入手できます。...
サーバー上にタスク プロセスがあります。 ps -ef | grep task を使用して表示すると...
目次コンポーネントの再帰呼び出しレンダリングメソッドの使用プロジェクトに取り組んでいると、左側のメニ...
目次1. ファイアウォールの現在の状態を確認する2. ファイアウォールサービスを開始する3. ファイ...
クイックリーディングSQL ステートメントを監視する必要があるのはなぜか、監視方法と監視手段について...
SSH 公開鍵認証は、SSH 認証方式の 1 つです。 SSH パスワードフリーのログインは公開鍵認...