基づきmysql5.7、InnoDBストレージエンジン
あなたのクエリまたはキーワード構造の増加は、SELECT文の前に説明では、MySQLは、クエリが実行プラン情報を返し実行し、クエリにマークを設定しますパフォーマンスのボトルネックを分析し、SQL文を実行するためにオプティマイザを説明シミュレートするためのキーワードを使用しますむしろからは一時テーブルにサブクエリ結果を実行しますサブクエリが含まれている場合、このSQLの実装で、より
table文の建設の終わりには、テキストに使用しています
俳優SELECT * FROMを説明します。
二つのテーブルがある場合は各テーブル意志の出力クエリの行、参加することで、出力は2行になりますクエリに参加
フィールド記述の結果を説明
1. ID列
カラムのID番号は、いくつかの選ばれた少数のID、ID及び順序は、選択成長の出現の順序であり、シリアル番号を選択しています。id列最後にNULLに行わ同じ下向きに、IDを実行するから、より高い実行優先度より大きいID。
2. SELECT_TYPE列
SELECT_TYPEは、対応する行は、単純または複雑なクエリであることを示しています。
1)シンプル:簡単なクエリ。クエリは、サブクエリ、ユニオンが含まれていません
2)主:最も外側の選択で複雑なクエリ
3)サブクエリ:いないFROM句でサブクエリ(に含まれる選択)
4)由来:から句のサブクエリに含まれます。MySQLはまたとして知られ、一時テーブルに結果を格納します
派生テーブル(派生英語の意味)
5)組合:の第二及びその後の組合を選択
例:
私は、MySQL 5.7をシャットダウンする必要があるため、派生テーブルをマージするためにそう見えない派生テーブルを最適化されています
セッションoptimizer_switchを設定=「derived_merge =オフ」;#閉じるmysql5.7新機能派生合併テーブルの最適化
#デフォルトの設定を復元;「上derived_merge =」設定セッションoptimizer_switch =
DER(フィルムからただし、ID = 1 *選択)から(ID = 1アクターから1を選択)を説明。
フィルムから選択*俳優組合SELECT * FROM説明。
3.テーブルの列
この列は、アクセスされている行を説明するテーブルを示しています。
句のサブクエリがある場合、表の列は、現在のクエリ依存クエリID = N、第1のクエリ実行ID = Nを示す、<derivedN>形式であります
組合、値のテーブル列UNION結果<組合1,2>、1及び2は、組合に関与する行選択IDを表す場合。
4.パーティション列
クエリがパーティションテーブルに基づいてされている場合、表示されるクエリは、地区を訪問します
5.タイプの列は、より重要です
この列には、関連の種類やMySQLがテーブル内の行を見つける方法を決定するアクセスの種類を示しています。
最高から最悪のためにある:システム>のconst>でeq_ref>参照>レンジ>インデックス> ALL、
一般的には、問い合わせがREFを達成するための最良の範囲のレベルを確保するために達しました、
ヌル:
MySQLのクエリが最適化フェーズに分解することができ、実施段階では、テーブルやインデックスをアクセスし直す必要はありません。たとえば:インデックス列の最小値を選択して、行うことができるだけでは、ルックアップ・インデックスが実行時にテーブルにアクセスする必要はありません
フィルムから選択分(ID)を説明します。
constの、システム:
MySQLは、クエリの一部のために最適化と定数に変換することができます。すべての列定数または主キーの一意のキーを比較した場合、一致する行1のルックアップテーブルが速く、読み出されます。constのシステムは、一つだけのデータテーブルシステムの特殊なケースであります
ID = 1フィルムSELECT * FROM SELECT * FROM説明します。
一意の主キーインデックスの問合せ、唯一のマッチングデータ、それはCONSTであり、2番目のクエリ結果に基づいて照会され、唯一の結果データにより、最初の文は、2番目のクエリを直接システムです。
でeq_ref:
主キーまたは一意キーのインデックスのすべての部分を使用して接続されるように、それが唯一の予選レコードを返します。これはおそらく最良の接続タイプで、簡単な選択クエリは、このタイプの外のconstには表示されません。
film_actor.film_id = film.id上に膜を参加左film_actor SELECT * FROM説明。
参照:
一意のインデックスを使用せずに、でeq_ref比較すると、いくつかの共通のプレフィックス索引または一意のインデックス、インデックスとより多くの条件を満たす行を見つけることが比較される値を使用します。
1.単純なSELECTクエリは、名前が一般的な指標である(非プライマリ・キー・インデックス)
film_id = 1 film_actor SELECT * FROM説明。
2.関連テーブルのクエリは、idx_film_actor_id共同インデックスfilm_idとACTOR_IDは、接頭語の使用はfilm_actorの左部分に、ここfilm_id。
フィルムから選択film_idを説明film.id = film_actor.film_idにfilm_actorに参加左;
範囲:
走査範囲は、通常、>、<、> =、などの操作の間に、()で起こります。範囲指定された行を取得するためにインデックスを使用。
ID> 1俳優SELECT * FROM説明。
インデックス:
ALL数よりも通常は高速です全表スキャンインデックス、。
フィルムSELECT * FROMを説明します。
ALL:
つまり、mysqlは必要な最初から最後までラインを見つける必要がある意味全表スキャン、です。多くの場合、これは、最適化するために、インデックスを追加する必要があります
俳優SELECT * FROMを説明します。
6. possible_keys列
この列には、見つけるためにインデックスを使用してクエリを示しています。
列は、完全なテーブルクエリを選択し、可能possible_keysは説明したときに、テーブル内のデータは、mysqlは少しの助けのこのクエリのインデックスを考えているので、ケースキー表示NULLながら、このような状況はあまりないですがあります。
列がnullの場合、関連する指標。あなたは、クエリのパフォーマンスを向上させるために適切なインデックスを作成し、where句を説明してチェックすることにより、結果を表示することができますこの場合、あなたは見ることができます。
7.キー列
この列は、実際には、テーブルへのアクセスを最適化するために使用されるインデックスMySQLを示しています。
あなたは、インデックスを使用しない場合、列はNULLです。あなたはpossible_keys列のインデックスを使用するか、無視するMySQLを強制したい場合は、クエリの力指数の使用は、インデックスを無視します。
8. key_lenにカラム
この列が使用されるインデックスのMySQLのバイト数を示し、この値は列インデックスで特定用いて算出することができます。
例えば、関節指数はFILM_ACTORをidx_film_actor_idとfilm_id INTは2つの列をACTOR_ID、それぞれが4バイトの整数です。インデックス・ルックアップを実行するfilm_idカラム:key_lenに= 4推論クエリの結果によって、最初の列を使用します。
film_id = 2 film_actor SELECT * FROM説明。
key_lenに計算規則を次のとおりです。
弦
CHAR(N):Nバイト長
VARCHAR(N):2バイト文字列の長さストレージ、それがUTF-8である場合、長さ3N + 2
数値型
TINYINT:1つのバイト
SMALLINT:2つのバイト
INT:4つのバイト
BIGINT:8つのバイト
時の型日:3つのバイト
タイムスタンプ:4つのバイト
日時:8つのバイト
フィールドがNULLを許可されている場合は、1つのバイトのレコードがNULLである必要があり
インデックスの最大長は、文字の最初の半分は、インデックス付き抽出され、文字列が長すぎる場合、MySQLは左に類似プリフィックス索引を処理するでしょう、768バイトです。
9. REF列
この列は、列の値または共通に使用される定数であり、テーブルルックアップのレコードのインデックスキー列を示している:CONST(定数)、フィールド名(例:film.id)
10行列
この列は、読み、mysqlは、検出の行数を見積もり、これは結果セットの行数ではないことに注意する必要があります。
11.ろ過カラム
どのくらいのデータは、フィルタリング会計します
12.余分な列がより重要です
この列には、追加情報があることを示しています。次のように重要な一般的な値は次のとおりです。
1)使用してインデックス:カバーリングインデックスを使用します
私たちは、一般の索引リーフ・ノードは、プライマリ・キー・インデックスに格納され、InnoDBのを知っているので、我々は最終的に普通の表情でデータを見つける必要があり、最後に、あなたは上記の主キーのインデックスツリー内のデータをフェッチする必要がありますが、フィールドには、我々は一般的なインデックスツリーのトップに自分自身を照会する場合現在、データを取るために、主キーインデックスツリーに戻るする必要はありません。並べ替えを含め、あまりにも、直接、ソートされたインデックスを使用することができます。
どこ名=「film0」フィルムから選択名を説明します。
2)使用場所:使用はどこ文の結果を処理するために、クエリー列は、インデックスによって覆われていません
俳優の場所名=「A」SELECT * FROM説明。
3)使用状態条件の指標:クエリの列が完全にカラムを主要条件の範囲インデックスによって覆われていません。
film_id> 2 film_actor SELECT * FROM説明。
4)一時を使用して:MySQLは、クエリを処理するために一時テーブルを作成する必要があります。これは、最適化するためにインデックスを使用しての最初の考えを最適化する一般起こります。
俳優からのSELECT DISTINCTの名前を説明します。
何のインデックスをactor.nameないし、明確な張に一時テーブルを作成します
この時間は、インデックスを使用して、余分なクエリであるfilm.name確立idx_name指数は、一時テーブルを使用していませんでした
フィルムからのSELECT DISTINCTの名前を説明します。
5)使用filesortレコード:外部ソートではなく、インデックスの並べ替え、メモリからの並べ替え、またはディスクにデータをソートするために行われる必要は小さいです。この場合も、一般的なインデックスの最適化を使用することを検討したいです。
actor.nameは、インデックスを作成しないで、テーブル全体が、俳優を閲覧ソートキー名とそれに対応するIDを保存し、名前、その後、ソートや行を取得します
名前で俳優の順SELECT * FROM説明。
インデックスは常にデータ構造の列の良い順となっているので、film.name確立idx_nameインデックスは、クエリは、インデックスを使用して余分で、指標の一種として使用することができます
名前による膜順SELECT * FROM説明。
6)アウェイ選択テーブルの最適化:索引の存在下でのフィールドにアクセスするために、いくつかの集計関数を(例えば、MAX、MINなど)を使用して
フィルムから選択分(ID)を説明します。
内蔵のテーブルのSQL:
DROP TABLE IFは EXISTS `actor`を。 CREATE TABLEを`actor`( ` id`のINT(11)NOT NULL 、 `NAME` VARCHAR(45)DEFAULTの NULL 、 PRIMARY KEY (` id`) )ENGINE =のInnoDB DEFAULTの CHARSET = UTF8。 INSERT INTO `actor`(` id`、 `NAME`)VALUES(1、' A ')、(2、' B')、(3、' C ' )。 DROP TABLE IFは EXISTS `film`を。 CREATE TABLEを`film`( ` id`のINT(11)NOT NULL AUTO_INCREMENT、 `NAME`のVARCHAR(10)DEFAULTの NULL 、 PRIMARY KEY (` id`)、 KEY `idx_name`(` NAME`) )ENGINE =のInnoDB DEFAULTの CHARSET = UTF8。 INSERT INTO`film`(` id`、 `NAME`)VALUES(3、' film0 ')、(1、' film1 ')、(2、' 膜2 ' )。 DROP TABLE IFは EXISTS `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を。 INSERT INTO `film_actor`(` id`、 `film_id`、` actor_id`)VALUES(1、1、1)、(2、1、2)、(3、2、1)。