序文 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. 初期index.html最初の写真、一番上の写真を作成します。写真の i...
MySQL は、コミュニティ エディション (コミュニティ サーバー) とエンタープライズ エディシ...
目次1. テーブル名を変更する方法2. 注記要約: 1. テーブル名を変更する方法RENAME TA...
ウェブサイトの構築を始めたばかりの初心者には、理解し、学ぶべきことがたくさんあります。ウェブサイトを...
1. xshell6をインストールする2. サーバー接続を作成し、ユーザー名とパスワードを入力します...
目次1. サーバーAのmy.cnfファイルを変更する2. サーバーBのmy.cnfファイルを変更する...
目次前面に書かれた環境の展開Zookeeper クラスタの展開Clickhouse クラスターの展開...
目次アレイ重複排除1 2層forループ(バブルソートの2層ループ記述に類似) 2 ループとインデック...
目次1. カウンターの実装2. 成果を達成する1. カウンターの実装ページにカウンターを実装するだけ...
1つ。 wget https://dev.mysql.com/get/mysql57-communi...
1. チェックステータスモジュールがインストールされているかどうかを確認します。 [root@loc...
CSS 組み合わせセレクターには、単純なセレクターのさまざまな組み合わせが含まれます。 CSS3 に...
目次1. CentOS 7.9 20にDockerをインストールする2. MySQL クラスターをデ...
Linuxでシェルスクリプトを共有して、MySQLのマスタースレーブ状態を監視し、エンタープライズW...
目次1. カスタム指示の登録1.1. グローバルカスタム指示1.2. ローカルカスタム指示2. カス...