ツールの紹介を説明します
SQL文、クエリのパフォーマンスボトルネック解析文または構造を実行するために、オプティマイザをシミュレートすることができEXPLAINキーワードを使用します。select文の前にexplaionキーワードを増やし、MySQLは代わりにSQLを実行すると、クエリが実行計画を実行するための情報を返し、クエリにマークを設定します。
Explaion分析例
-- actor建表语句:
CREATE TABLE `actor` (
`id` int(11) NOT NULL,
`name` varchar(45) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- film建表语句:
CREATE TABLE `film` (
`id` int(11) NOT NULL,
`name` varchar(10) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- film_actor建表语句:
CREATE TABLE `film_actor` (
`id` int(11) NOT NULL,
`film_id` int(11) NOT NULL,
`actor_id` int(11) NOT NULL,
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_film_actor_id` (`film_id`,`actor_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
実行は、説明します。
explain select * from actor;
select文は、select文の前で結果を返す場合、このクエリのリターンがSQL文を実行した説明で。
二つの変種をEXPLAIN
拡張された説明
余分なクエリの最適化を説明に基づいていくつかの情報を提供しています。ショーの警告によってクエリが続く最適化することができ、オプティマイザが最適化されたかを確認するコマンド。また、ろ過カラムは、ハーフポイント値の比は、行* / 100に行数を推定することができ、テーブルが現在のテーブルID値よりも小さい説明フロント接続を(前の表は、ID値を参照して説明し、濾過表)。
explain EXTENDED select * from actor where id = 1;
パーティションを説明
クエリがパーティションテーブルに基づいている場合、フィールドのパーティションよりも多くを説明比べると、クエリがパーティションにアクセスします表示されます。
列の説明
ID列
カラムのID番号は、いくつかの選ばれた少数のID、ID及び順序は、選択成長の出現の順序であり、シリアル番号を選択しています。
同じ実行ダウンからより高い実行優先順位のID、ID大きく、ID最後にNULLとして実行されます。
explain select (select 1 from actor where id = 1) from (select * from film
where id = 1) der;
タイプを選択する列
選択タイプは、対応する行は、単純または複雑なクエリであることを示しています。
シンプル:簡単なクエリ。クエリは、サブクエリ、ユニオンが含まれていません。
explain select * from film where id=1
プライマリ:複雑なクエリは、最も外側の選択
サブクエリ:(ないから句の)選択のサブクエリは、
由来:クエリサブ句から成ります。MySQLは、派生テーブルと呼ばれ、一時テーブルに結果を格納します。
explain select (select 1 from actor where id = 1) from (select * from film
where id = 1) der;
組合:組合キーワードでその後selelct。
EXPLAIN select 1 union all select 1;
テーブルの列
この列は、アクセスされている行を説明するテーブルを示しています。
サブ句は、クエリから存在し、テーブルの列
組合、値のテーブル列UNION結果<組合1,2>、1及び2は、組合に関与する行選択IDを表す場合。
型の列
この列は、関連の種類やMySQLがテーブル内の行を検索する方法を決定するアクセスのタイプを示し、対応するデータ列のおおよその範囲を見つけます。
最悪であることが最善のために:システム>のconst>でeq_ref>参照 >範囲>インデックス>すべての
一般的な、クエリが好ましくREFまで、レベル範囲に到達することを確認する必要があります。
NULL:MySQLのクエリは最適化フェーズに分解することができ、実施段階では、テーブルやインデックスにアクセスする必要はありません。例えば:アクセステーブルなしで実行された場合、インデックス列の最小値を選択し、検索インデックスは、個々に行うことができます。
EXPLAIN select min(id) from film;
- CONST、システムのMySQLがクエリの一部を最適化(結果を表示する警告として見ることができる)定数に変換することができます。primayキーまたは一意キーのすべての列定数を比較するので、より速い最大1個の一致するテーブルの行、1つの読み出し、高速読み出しである場合。システムは、マッチした要素のテーブルで唯一の行の特別な場合であるCONSTシステム。
EXPLAIN select * from (select * from film where id= 1) as tmp;
- でeq_ref:すべての部品primayキーやユニークキーインデックスを使用して接続されるように、それが唯一の予選レコードを返します。これは、タイプに参加する、単純なSELECTクエリは、このタイプを表示されません。おそらく最高の外のconstです。
EXPLAIN select * from (select * from film where id= 1) as tmp;
- REF:比べでeq_ref、NA一意のインデックスが、一般的なインデックスまたはプレフィックスのユニークインデックス部、およびより多くの条件を満たす行を見つけることが比較された値に索引を使用。
単純なSELECTクエリは、名前が一般的な指標である(非プライマリキーインデックスまたは一意のインデックス)
EXPLAIN select * from film where name='film1';
関連クエリは、idx_film_actor_id
それがあるfilm_id
とactor_id
し、ここで使用して共同インデックス、film_actor
プレフィックスの左側film_id
部分。
EXPLAIN select film_id from film LEFT JOIN film_actor on film.id = film_actor.film_id;
- 範囲:通常のスキャン範囲は、>、<、> =、などの操作の間に、()で起こります。範囲指定された行を取得するためにインデックスを使用。
EXPLAIN select * from actor WHERE id >1;
- インデックス:全表スキャンインデックスはすべての数よりも通常は高速です
EXPLAIN select * from film;
- すべては:すなわち、全表スキャンでは、MySQLが必要な最初から最後までラインを見つける必要があることを意味します。この場合、最適化するインデックスを増やす必要があります。
EXPLAIN SELECT * from actor;
possible_keys列
この列には、見つけるために、クエリタイプを選択するかもしれないものを示しています。
場合に発生する可能性のある説明possible_keys
の列があり、かつNULLにキーとして表示され、このような状況は、多くのデータテーブルではないため、MySQLは少しの助けのこのクエリのインデックスを考えて、全表スキャンを選択してください。
この列がNULLである場合は、該当するインデックスがありません。この場合、あなたが適切なインデックスを作成することができる場合句は、次に説明して結果を表示、参照する場所を確認することで、クエリのパフォーマンスを向上させることが可能です。
EXPLAIN SELECT * from film_actor where film_id =1;
キー列
この列には、実際に使用のMySQLのテーブルにアクセスするためにどのインデックスを示しています。
あなたは、インデックスを使用しない場合は、NULLとして再分類しました。あなたが使用したり、無視してMySQLを強制したい場合はpossible_keys
、列のインデックスを、クエリの力指数の使用は、インデックスを無視します。
key_lenに列
この列は、列がインデックス値によって特異的に使用されていると推定することができるインデックスMySQLで使用されるバイトの数を示します。
EXPLAIN SELECT * from film_actor where film_id =1;
film_actor
索引付けジョイントはidx_film_actor_id
なさfilm_id
とactor_id
二つの列のID、INTそれぞれが4バイトです。結果によってkey_len
= 4推論されたクエリは、最初の列を使用しています:film_id
列のインデックス検索が実行されます。
ken_len
次のように計算ルールは以下のとおりです。
文字列
文字(N):Nバイト長
のvarchar(N):Nストレージの文字列の長さバイトがUTF-8である場合、次に長さは3N + 2であります値型
TINYINT 1バイト
SMALLINT:2バイト
INT:4バイト
BIGINT:8つのバイト時の型
日:3バイト
のタイムスタンプ:4バイト
のdatetime:8つのバイト
フィールドがNULL許可されている場合は、かどうかを1バイトのNULLレコードを必要と
インデックスが768バイトの最大長は、文字列が長すぎるとき、ある、MySQLは接頭辞のインデックスも同様の処理を行います、文字列は、インデックスの前半部から抽出されます。
REF列
CONST(定数)、フィールド名など:この列には、列の値または共通に使用される定数であるテーブルルックアップのレコードの索引キー列を示しています。そう定数REF列である場合、一般的に、列がフィールド名で、CONST、CONST REFであり、等号に関連付けられた検索基準又は条件の権利を重視。
EXPLAIN SELECT * from film_actor where film_id =1;
行列
この列は、行数を読み取って、試験すべきMySQLの推定値であり、これは、結果セットの行数ではないことに注意してください。
余分な列
この列には、追加情報です。
- インデックスを使用して:(フィールド結果が選択film_id後、すなわちインデックスセットである)カバリングインデックスを使用
explain select film_id from film_actor where film_id=1;
- インデックス条件を使用して、クエリの列が完全に条件がプリアンブルの範囲であるインデックスによって覆われていません
explain select * from film_actor where film_id > 1;
- 結果を処理するためにWHERE句を使用して、クエリのカラムがインデックスによって覆われていない。ここで使用
explain select * from actor where name ='a'
- クエリを処理するために一時テーブルを作成するmysqlの必要性:一時を使用。これは通常、最適化されることを起こる、私たちは、最初のインデックスの最適化であると考えなければなりません。
explain select DISTINCT name from actor;
何のインデックスactor.nameない、そして明確なに対処するための一時テーブルを作成します。
explain select DISTINCT name from film;
一般的な指標の確立をfile.name、余分なインデックスの使用はお問い合わせは、一時テーブルを使用していませんでした。この時点です。
- filesortレコードの使用:外部ソートではなく、インデックスの並べ替えを、メモリからのソート、またはディスク内のデータをソートするために行われる必要があることは少ないです。この場合も、一般的なインデックスの最適化を使用することを検討したいです。
explain select * from actor order by name;
actor.nameは、インデックスを作成しないで、あなたはその後、ソート列に名前を付け、検索、ソートキー名とそれに対応するIDを保存し、acotrテーブル全体を閲覧します。
explain select * from film order by name;
film.nameは、クエリがインデックスを使用して余分であるこの時点では、idx_nameインデックスを設立しました。
- 離れて最適化されたテーブルを選択します。索引の存在下でのフィールドにアクセスするためにいくつかの集計関数(MAX、MIN例)を用いて
explain select min(id) from film ;
私は公共の数を懸念していませんよ?
- 以下のように受信することができる[社会的関心Xiaoqiang高度道路の二次元コードの数を終了スイープ。
- 教材:1Tビデオチュートリアル:フロントとリアエンドはJavaweb教育ビデオ、機械学習/ AI教育ビデオ、Linuxシステムのチュートリアル動画、IELTSのビデオチュートリアルをカバー。
- 以上の100冊:含むC / C ++やJava、Pythonプログラミング言語は3冊、LeetCodeの説明Daquanのを見なければなりません。
- ソフトウェアツール:ほとんどのソフトウェアは、ほとんどあなたが道をプログラミングに使用する場合があります含み;
- プロジェクトソース:20件のJavaWebソースプロジェクト。