10bet网址
MySQL 5.6リファレンスマニュアル
本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb
HTML下载(TGZ)- 7.2 mb
HTML下载(邮政编码)- 7.2 mb


8.8.2 explain出力フォマット

解释ステトメントは选择ステトメントの実行プランに関する情報を提供します。

解释选择ステトメントで使用される各テブルに関する情報の行を返します。これは,米ySQL がステートメントの処理中にテーブルを読み取る順番で、出力にテーブルを一覧表示します。MySQL は Nested Loop 結合メソッドを使用して、すべての結合を解決します。これは、MySQL が最初のテーブルから行を読み取り、次に 2 つめのテーブル、3 つめのテーブルというように、一致する行を見つけることを意味します。すべてのテーブルが処理されると、MySQL は選択したカラムを出力し、さらに一致する行があるテーブルが見つかるまで、テーブルリストを逆戻りします。次の行がテーブルから読み取られ、プロセスは次のテーブルに進みます。

扩展キワドを使用すると,解释は,解释ステトメントに続けて显示警告ステトメントを発行することで表示できる追加の情報を生成します。解释扩展フィルタ処理されたカラムも表示します。セクション8.8.3 " explain extended出力フォマット"を参照してください。

注記

扩展キワドと分区キワドを,同じ解释ステトメントで一緒に使用することはできません。

解释出力カラム

このセクションでは,解释によって生成される出力カラムにいて説明します。あとのセクションで,类型额外的カラムに関する追加情報を提供します。

解释からの各出力行は1のテブルに関する情報を提供します。各行には,表8.1 " explain出力カラム"で要約し,次の表に詳しく説明している値が格納されます。

表8.1解释出力カラム

カラム 意味
id 选择識別子。
select_type 选择
表格 出力行のテブル
分区 一致するパティション
类型 結合型
possible_keys 選択可能な邮箱ンデックス
关键 実際に選択された邮箱ンデックス
key_len 選択されたキの長さ
裁判 ンデックスと比較されるカラム
調査される行の見積もり
过滤后的 テブル条件によってフィルタ処理される行の割合
额外的 追加情報

  • id

    选择識別子。これはクエリー内の选择の連番です。行がほかの行の和集合結果を参照する場合に,値はになることがあります。この場合,表格カラムには,<联盟N>などの値が表示され,行がおよびNid値のある行の和集合を参照していることが示されます。

  • select_type

    选择の種類で,次の表に示すもののいずれかになります。

    select_type 意味
    简单的 単純な选择联盟やサブクエリを使用しません)
    主要的 もっとも外側の选择
    联盟 联盟内の2め以降の选择ステトメント
    依赖联盟 联盟内の2め以降の选择ステトメントで,外側のクエリに依存します
    联盟的结果 联盟の結果。
    子查询 サブクエリ内の最初の选择
    相关子查询 サブクエリ内の最初の选择で,外側のクエリに依存します
    派生的 派生テブル选择句内のサブクエリ)
    物化 実体化されたサブクエリ
    当前子查询 結果をキャッシュできず,外側のクエリの行ごとに再評価される必要があるサブクエリ
    各种联盟 キャッシュ不可能なサブクエリ(当前子查询を参照してください)に属する联盟内の2め以降のselect

    依赖は一般に,相関サブクエリの使用を示します。セクション13.2.10.7 "相関サブクエリ"を参照してください。

    相关子查询の評価は当前子查询の評価とは異なります。相关子查询の場合,その外部コンテキストの変数の異なる値の各セットにつき,一回だけサブクエリーが再評価されます。当前子查询の場合,外部コンテキストの行ごとにサブクエリが再評価されます。

    サブクエリのキャッシュ可能性は,クエリ結果のキャッシュ(これに)セクション8.9.3.1 "クエリキャッシュの動作"で説明しています)と異なります。サブクエリのキャッシュは、クエリー実行中に行われ、クエリーキャッシュは、クエリーの実行が終了したあとにのみ、結果を格納するために使用されます。

  • 表格

    出力の行で参照しているテブルの名前。これも次のいずれかの値になることがあります。

    • <联盟N>:行はおよびNid値のある行の和集合を参照しています。

    • <派生N>:行はNid値のある行の派生テブル結果を参照しています。派生テブルは,たとえば句内のサブクエリの結果などになります。

    • <子查询N>:行はNid値のある行の実体化されたサブクエリの結果を参照しています。セクション8.2.1.18.2 "サブクエリ実体化によるサブクエリの最適化"を参照してください。

  • 分区

    クエリでレコドが照合されるパティション。このカラムは,分区キワドが使用されている場合にのみ表示されます。パティション化されていないテーブルの場合、この値はです。セクション19.3.5 "パティションに関する情報を取得する"を参照してください。

  • 类型

    結合型。さまざまな型の説明にいては,”解释結合型を参照してください。

  • possible_keys

    possible_keysカラムは,MySQLがこのテンデックスを示します。このカラムは解释の出力に表示されたテブルの順序にまったく依存しません。まり,possible_keysのキの一部は,生成されたテブルの順序で実際に使用できないことがあります。

    このカラムがの場合は、関連する以及ンデックスがありません。この場合,在哪里句を調査して,それがインデックス設定に適したカラムを参照しているかどうかをチェックすることで,クエリーのパフォーマンスを向上できることがあります。その場合は,適切なeンデックスを作成し,再度解释でクエリをチェックします。セクション13.1.7 " alter table構文"を参照してください。

    テブルにあるンデックスを確認するには,显示指数从tbl_nameを使用します。

  • 关键

    关键カラムは,MySQLが実際に使用することを決定したキ()を示します。MySQLが行をルックアップするために,いずれかのpossible_keysereplicationンデックスを使用することを決定した場合、キereplication値としてそのereplicationンデックスが一覧表示されます。

    关键possible_keys値に存在しない邮箱ンデックスを指定している可能性があります。これはpossible_keysインデックスのどれも行のルックアップに適していない場合に発生する可能性がありますが,クエリーによって選択されるすべてのカラムはほかのインデックスのカラムになります。まり,指定されたインデックスは選択されたカラムをカバーするため、取得する行を決定するために使用されませんが、インデックススキャンはデータ行スキャンよりも効率的です。

    InnoDBは各セカンダリ邮箱ンデックスとともに主キ邮箱値を保存するため,InnoDBでは,クエリーで主キーも選択している場合でも,セカンダリインデックスで選択されたカラムをカバーしている可能性があります。关键の場合,MySQLはクエリーをより効率的に実行するために使用するインデックスを見つけられませんでした。

    MySQLでpossible_keysカラムに示された,ンデックスを強制的に使用させるか,無視させるには,クエリ,で力指数使用索引,または忽略指数を使用します。セクション13.2.9.3 " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `を参照してください。

    MyISAMテブルとNDBテブルの場合,分析表を実行することで,オプティマ。NDBテブルの場合,これにより,分散されたプッシュダウン結合のパフォマンスも向上します。MyISAMテブルの場合,myisamchk——分析分析表と同じことを実行します。セクション7.6 " MyISAMテブルの保守とクラッシュリカバリ"を参照してください。

  • key_len

    key_lenカラムは,MySQLが使用することを決定したキの長さを示します。关键カラムにと示されている場合,この長さはになります。key_lenの値によって,MySQLが実際に使用するマルチパトキのパト数を判断できます。

  • 裁判

    裁判カラムは,テ,ブルから行を選択するために,关键カラムに指定された邮箱ンデックスに対して比較されるカラムまたは定数を示します。

    値が函数の場合,使用される値は,特定の関数の結果です。どの関数か確認するには,解释扩展のあとに显示警告を付けて使用します。関数は,実際には算術演算子などの演算子である場合があります。

  • カラムは,MySQLがクエリを実行するために調査する必要があると考える行数を示します。

    InnoDBテブルの場合,これは推定値であり,常に正確ではないことがあります。

  • 过滤后的

    过滤后的カラムは,テブル条件によってフィルタ処理されるテブル行の推定の割合を示します。まり,は調査される推定の行数を示し,×过滤后的/One hundred.が前のテブルと結合される行数を示します。解释扩展を使用すると,このカラムが表示されます。

  • 额外的

    このカラムには,MySQLがクエリを解決する方法に関する追加情報が含まれます。さまざまな値の説明にいては,”解释の追加情報を参照してください。

解释結合型

解释出力の类型カラムには,テブルの結合方法が示されます。次のリストに,もっとも適切な型からもっとも不適切な型の順番で並べた結合型を示します。

  • 系统

    テブルには行が1しかありません(= systemテブル)。これは,常量結合型の特殊なケスです。

  • 常量

    テブルには,一致するレコドが最大で1あり,クエリの開始時に読み取られます。行が1つしかないため,この行のカラムの値は,オプティマイザの残りによって定数とみなされることがあります。常量テブルは,1回しか読み取られないため,非常に高速です。

    常量主键または独特的帐号ンデックスのすべてのパ帐号トを定数値と比較する場合に使用されます。次のクエリでは,tbl_name常量テブルとして使用できます。

    SELECT * FROMtbl_name在哪里primary_key= 1;SELECT * FROMtbl_name在哪里primary_key_part1= 1,primary_key_part2= 2;
  • eq_ref

    前のテブルの行の組み合わせごとに,このテブルから1行ず。系统常量型以外で,これは最適な結合型です。これは,結合でインデックスのすべてのパートが使用されており、インデックスが主键または独特的非空ンデックスである場合に使用されます。

    eq_refは,演算子を使用して比較される邮箱ンデックス設定されたカラムに使用できます。比較値は,定数またはこのテブルより前に読み取られたテブルのカラムを使用する式を指定できます。次の例では,MySQLはeq_ref結合を使用して,ref_tableを処理できます。

    SELECT * FROMref_tableother_table在哪里ref_tablekey_columnother_table;SELECT * FROMref_tableother_table在哪里ref_tablekey_column_part1other_tableref_tablekey_column_part2= 1;
  • 裁判

    前のテーブルの行の組み合わせごとに,一致するインデックス値を持つすべての行がこのテーブルから読み取られます。裁判は,結合でキ,の左端のプリフィクスのみが使用される場合,またはキ,が主键独特的インデックスではない場合(つまり,結合で,キー値に基づいて単一の行を選択できない場合)に使用されます。使用されているキがほんの数行にしか一致しない場合,これは適切な結合型です。

    裁判は,または< = >演算子を使用して比較される邮箱ンデックス設定されたカラムに使用できます。次の例では,MySQLは裁判結合を使用して,ref_tableを処理できます。

    SELECT * FROMref_table在哪里key_columnexpr;SELECT * FROMref_tableother_table在哪里ref_tablekey_columnother_table;SELECT * FROMref_tableother_table在哪里ref_tablekey_column_part1other_tableref_tablekey_column_part2= 1;
  • 全文

    結合は全文ンデックスを使用して実行されます。

  • ref_or_null

    この結合型は,裁判と似ていますが,MySQLが値を含む行の追加検索を実行することが追加されます。この結合型の最適化は,ほとんどの場合に、サブクエリーの解決で使用されます。次の例では、MySQL はref_or_null結合を使用して,ref_tableを処理できます。

    SELECT * FROMref_table在哪里key_columnexprkey_column是零;

    セクション8.2.1.8 " is nullの最適化"を参照してください。

  • index_merge

    この結合型は邮箱ンデックスマ邮箱ジ最適化が使用されたことを示します。この場合,出力行の关键カラムには使用されたンデックスのリストが含まれ,key_lenには使用された邮箱ンデックスの最長キ邮箱パ邮箱トのリストが含まれます。詳細にいては,セクション8.2.1.4 " escンデックスマジの最適化"を参照してください。

  • unique_subquery

    この型は,次の形式のサブクエリの裁判を置き換えます。

    价值(选择primary_keysingle_table在哪里some_expr

    unique_subqueryは,効率化のため,サブクエリ。

  • index_subquery

    この結合型はunique_subqueryに似ています。サブクエリを置き換えますが,次の形式のサブクエリンデックスに対して機能します。

    价值(选择key_columnsingle_table在哪里some_expr
  • 范围

    行を選択するためのンデックスを使用して,特定の範囲にある行のみが取得されます。出力行の关键カラムは、使用される以及ンデックスを示します。key_lenには使用された最長の邮箱ンデックスパ邮箱トが格納されます。この型の裁判カラムはです。

    范围は,<>>> =<< =为空< = >之间的,または在()演算子のいずれかを使用して,キカラムを定数と比較する場合に使用できます。

    SELECT * FROMtbl_name在哪里key_column= 10;SELECT * FROMtbl_name在哪里key_column在10到20之间;SELECT * FROMtbl_name在哪里key_column在(10年,20年,30);SELECT * FROMtbl_name在哪里key_part1= 10,key_part2在(10年,20年,30);
  • 指数

    指数結合型は,ンデックスリ,がスキャンされることを除いて,所有と同じです。これは2 つの方法で行われます。

    • インデックスがクエリーのカバリングインデックスで,使用すると,テーブルから必要なすべてのデータを満たすことができる場合,インデックスツリーのみがスキャンされます。この場合,额外的カラムには使用索引と示されます。ンデックスのサイズは通常テーブルデータより小さいため、インデックスのみのスキャンは通常、所有より高速です。

    • フルテーブルスキャンは,インデックスからの読み取りを使用して,インデックス順でデータ行をルックアップして実行されます。额外的カラムに使用索引が表示されません。

    MySQLは,クエリーで単一のインデックスの一部であるカラムのみが使用されている場合に,この結合型を使用できます。

  • 所有

    フルテブルスキャンは,前のテブルの行の組み合わせごとに実行されます。これは,通常テブルが常量とマクされていない最初のテブルである場合には適しておらず,通常ほかのすべてのケスで著しく不適切です。通常,定数値または以前のテーブルからのカラム値に基づいて,テーブルからの行の取得を可能にするインデックスを追加することで,所有を回避できます。

解释の追加情報

解释出力の额外的カラムには,MySQLがクエリを解決する方法に関する追加情報が含まれます。次のリストに,このカラムに表示される可能性のある値にいて説明します。クエリを可能なかぎり高速にしたい場合は,使用filesortおよび使用临时额外的値に注意します。

  • 孩子的表格“推join@1

    このテブルは,ndbカネルにプッシュダウンできる結合内の表格の子として参照されます。米ySQL Cluster で、プッシュダウンされた結合が有効な場合にのみ適用されます。詳細と例については、ndb_join_pushdownサバシステム変数の説明を参照してください。

  • 未找到Const行

    选择……从tbl_nameなどのクエリの場合,テブルは空でした。

  • 删除所有行

    删除に対し,一部のストレジエンジン(MyISAMなど)は簡単で高速にすべての行テブルを削除するハンドラメソッドをサポトしています。この额外的値は,エンジンでこの最適化が使用された場合に表示されます。

  • 截然不同的

    MySQLは個別の値を検索するため,最初に一致する行が見つかったら,現在の行の組み合わせについてのそれ以上の行の検索を停止します。

  • FirstMatch (tbl_name

    tbl_nameには,準結合FirstMatch結合ショ,トカット戦略が使用されます。

  • 全扫描NULL键

    これは,オプティマイザがインデックスルックアップアクセスメソッドを使用できない場合の代替の戦略として,サブクエリーの最適化で行われます。

  • 不可能有

    句は常に假で,どの行も選択できません。

  • 不可能的,

    在哪里句は常に假で,どの行も選択できません。

  • 在读取const表后注意到WHERE不可能

    MySQLはすべての常量(および)系统)テブルを読み取り,在哪里句が常にfalseであることを通知します。

  • LooseScan (..n

    準結合LooseScan戦略が使用されます。nはキパト番号です。

  • 实现扫描

    MySQL 5.6.7より前では,これは単一の実体化された一時テブルの使用を示します。扫描が存在する場合,テ。そうでない場合は,ンデックスルックアップが使用されます。さらに,开始实现エントリも参照してください。

    MySQL 5.6.7現在,実体化は,物化select_type値のある行と,<子查询N>表格値のある行によって示されます。

  • 没有匹配的最小/最大行

    选择最小值(…)从…在哪里条件などのクエリの条件を満たす行がありません。

  • const表中没有匹配的行

    結合のあるクエリーで,空のテーブルまたは一意のインデックス条件を満足する行がないテーブルがありました。

  • 分区修剪后没有匹配的行

    删除または更新に対し,オプティマイザはパーティションのプルーニング後に削除または更新するものが何も見つかりませんでした。それは,选择ステトメントの不可能的,に意味が似ています。

  • 使用没有表

    クエリに句がないか,从双句があります。

    插入または取代ステトメントで,选择パトがない場合に,解释にこの値が表示されます。たとえば,解释INSERT INTO t VALUES(10)に対して,それは解释插入到t SELECT 10 FROM DUALと同等であるために表示されます。

  • 不存在

    MySQLはクエリに対する左连接最適化を実行でき,左连接1条件に一致するつの行が見つかったら,前の行の組み合わせについて,このテーブルでそれ以上の行を調査しません。これは,このように最適化できるクエリの種類の例です。

    SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2。id t2的地方。id为空;

    t2.id非空で定義されているとします。この場合,MySQLはt1をスキャンし,t1.idの値を使用してt2内の行をルックアップします。MySQLがt2内に一致する行を見けた場合,t2.idにならないことがわかっているため,同じid値を持emft2内の残りの行をスキャンしません。まり,t1の各行にいて,MySQLは,t2内の実際に一致する行数にかかわらず,t2内の単一のルックアップのみを実行する必要があります。

  • 检查每个记录的范围(索引映射:N

    MySQLは使用に適したインデックスを見つけられませんでしたが,前のテーブルからのカラム値がわかったあとに,いくつかのインデックスが使用できることがわかりました。以前のテブルの行の組み合わせごとに,MySQLは范围またはindex_mergeアクセスメソッドを使用して,行を取得できるかどうかをチェックします。これは,非常に高速ではありませんが、インデックスがまったくない結合の実行より高速です。前のテーブルのすべてのカラム値がわかっており、定数とみなされることを除き、適用基準は、セクション8.2.1.3 " rangeの最適化"セクション8.2.1.4 " escンデックスマジの最適化"で説明されているとおりです。

    e .ンデックスは,テ.ブルの显示指数に示される同じ順序で1から番号付けされます。ンデックスマップ値Nは、候補となる以及ンデックスを示すビットマスク値です。たとえば,0 x19(2進数の11001)の値は,e @ンデックス1,4,および5が考慮されることを示します。

  • 扫描N数据库

    これは,セクション8.2.4 " information_schemaクエリの最適化"に説明するように,サバがINFORMATION_SCHEMAテブルのクエリを処理する際に実行するディレクトリスキャンの数を示します。Nの値は0,1,または所有です。

  • 选择已优化的表

    クエリにはすべて(MIN ()MAX ()),またはCOUNT (*)のみが含まれていますが,集团句は含まれていませんでした。オプティマ邮箱ザは1行のみを返すべきであると判断しました。

  • Skip_open_tableOpen_frm_onlyOpen_trigger_onlyOpen_full_table

    これらの値は,セクション8.2.4 " information_schemaクエリの最適化"に説明するように,INFORMATION_SCHEMAテブルに対するクエリに適用するファルオプン最適化を示します。

    • Skip_open_table:テブルファ。データベースディレクトリをスキャンすることによって,クエリー内ですでに情報を使用できるようになっています。

    • Open_frm_only:テブルの.frmファ邮箱ルのみを開く必要があります。

    • Open_trigger_only:テブルの.TRGファ邮箱ルのみを開く必要があります。

    • Open_full_table:最適化されていない情報のルックアップ。.frm.MYD,および.MYIファ邮箱ルを開く必要があります。

  • 开始实现最终实现扫描

    MySQL 5.6.7より前では,これは複数の実体化された一時テブルの使用を示します。扫描が存在する場合,テ。そうでない場合は,ンデックスルックアップが使用されます。さらに,实现エントリも参照してください。

    MySQL 5.6.7現在,実体化は,物化select_type値のある行と,<子查询N>表格値のある行によって示されます。

  • 开始临时暂时的结束

    これは,準結合重複除去戦略の一時テブルの使用を示します。

  • 未找到唯一行

    选择……从tbl_nameなどのクエリの場合に,テブルに独特的ンデックスまたは主键の条件を満たす行がありません。

  • 使用filesort

    MySQLはソト順で行を取得する方法を見けるために,追加のパスを実行する必要があります。ソトは,結合型に従ってすべての行を進み,ソと在哪里句に一致するすべての行に。次にキがソトされ,ソト順で行が取得されます。セクション8.2.1.15 " order byの最適化"を参照してください。

  • 使用索引

    実際の行を読み取るための追加のシークを実行する必要がなく,インデックスツリーの情報のみを使用して,テーブルからカラム情報が取得されます。この戦略は,クエリンデックスの一部であるカラムのみを使用している場合に使用できます。

    额外的カラムに使用在哪里とも示されている場合,キー値のルックアップを実行するためにインデックスが使用されていることを意味します。使用在哪里がない場合,オプティマイザはインデックスを読み取って,データ行の読み取りを回避できますが,それをルックアップに使用していません。たとえば,ンデックスがクエリーのカバリングインデックスである場合、オプティマイザはそれをルックアップに使用せずにそれをスキャンできます。

    ユーザー定義のクラスタ化されたインデックスを持つInnoDBテブルの場合,そのンデックスは额外的カラムに使用索引がない場合でも使用できます。これは,类型指数关键主要的の場合です。

  • 使用索引条件

    インデックスタプルにアクセスし,まずそれらをテストして,すべてのテーブル行を読み取るかどうかを判断することによって,テーブルが読み取られます。このように,必要でないかぎり,すべてのテブル行の読み取りを遅延(プッシュダウン)するためにンデックス情報が使用されます。セクション8.2.1.6 " econfンデックスコンディションプッシュダウンの最適化"を参照してください。

  • 使用索引进行分组

    使用索引テブルアクセスメソッドと同様に,使用索引进行分组はMySQLが,実際のテブルへの追加のディスクアクセスをせずに,集团または截然不同的クエリのすべてのカラムを取得するために使用できる。さらに,各グループに対して、少数のインデックスエントリだけが読み取られるように、インデックスがもっとも効率的に使われます。詳細については、セクション8.2.1.16 " group byの最適化"を参照してください。

  • 使用连接缓冲区(块嵌套循环)使用连接缓冲区(批处理键访问)

    初期の結合からのテーブルは,部分ごとに結合バッファーに読み込まれ,それらの行がバッファーから使用されて,現在のテーブルとの結合が実行されます。(块嵌套循环)は块嵌套循环アルゴリズムの使用を示し,(批处理关键访问)は批量密钥访问アルゴリズムの使用を示します。まり,解释出力の前の行のテブルからのキがバッファリングされ,使用加入缓冲が表示された行によって表されるテブルから,一致する行が一括してフェッチされます。

  • 使用MRR

    テブルは多范围读取最適化戦略を使用して読み取られます。セクション8.2.1.13 " Multi-Range Readの最適化"を参照してください。

  • 使用sort_union(…)使用联盟(…)使用相交(…)

    これらはindex_merge結合型で邮箱ンデックススキャンがどのようにマ邮箱ジされるかを示しています。セクション8.2.1.4 " escンデックスマジの最適化"を参照してください。

  • 使用临时

    クエリを解決するために,MySQLは結果を保持する一時テブルを作成する必要があります。これは一般に,クエリ,に,カラムを異なって一覧表示する集团句と命令句が含まれる場合に発生します。

  • 使用在哪里

    在哪里句は,次のテーブルに対して照合されるか,またはクライアントに送信される行を制限するために使用されます。具体的にテブルからすべての行をフェッチするか,調査する意図がないかぎり,额外的値が使用在哪里でなく,テブル結合型が所有または指数である場合,クエリに何らかの誤りがある可能性があります。

  • 使用where和push条件

    この項目はNDBテブルのみに適用されます。まり,米ySQL Cluster がコンディションプッシュダウン最適化を使用して、インデックス設定されていないカラムと定数の直接比較の効率を向上します。そのような場合、条件がクラスタのデータノードにプッシュダウンされ,すべてのデタノドで同時に評価されます。これにより,一致しない行をネットワーク経由で送る必要がなくなり,コンディションプッシュダウンを使用できるが使用しない場合より,そのようなクエリーを5 - 10倍高速化できます。詳細にいては,セクション8.2.1.5 "エンジンコンディションプッシュダウンの最適化"を参照してください。

解释出力の解釈

解释出力のカラムの値の積を取得することで,結合がどの程度適しているかを示す適切な目安を得ることができます。これは,クエリを実行するためにMySQLが調査する必要がある行数を大ざっぱに示すはずです。max_join_sizeシステム変数によってクエリを制限する場合,この行の積は,どの複数テブル选择ステトメントを実行し,どれを中止するかを判断するためにも使用されます。セクション8.11.2 "サバパラメタのチュニング"を参照してください。

次の例は,解释によって得られた情報に基づいて,複数テブル結合を段階的に最適化する方法を示しています。

ここに示す选择ステトメントがあり,解释を使用して調査するもりであるとします。

解释选择tt。TicketNumber, tt。TimeIn, tt。ProjectReference, tt。EstimatedShipDate, tt。ActualShipDate, tt。ClientID, tt。ServiceCodes, tt。RepetitiveID, tt。CurrentProcess, tt。CurrentDPPerson, tt。RecordVolume, tt。DPPrinted、et.COUNTRY et_1。国家,做。CUSTNAME FROM tt, et, et AS et_1, do WHERE tt。SubmitTime是NULL和tt。ActualPC=et.EMPLOYID AND tt.AssignedPC = et_1.EMPLOYID AND tt.ClientID = do.CUSTNMBR;

この例では次のように想定しています。

  • 比較対象のカラムは次のように宣言されています。

    テブル カラム デタ型
    tt ActualPC CHAR (10)
    tt AssignedPC CHAR (10)
    tt ClientID CHAR (10)
    EMPLOYID CHAR (15)
    CUSTNMBR CHAR (15)
  • テブルには次の。

    テブル ンデックス
    tt ActualPC
    tt AssignedPC
    tt ClientID
    EMPLOYID(主キ)
    CUSTNMBR(主キ)
  • tt。ActualPC値は均一に分布されていません。

最初,最適化が実行される前は,解释ステトメントで次の情報が生成されました。

表类型possible_keys key key_len ref rows Extra et ALL PRIMARY NULL NULL NULL 74 do ALL PRIMARY NULL NULL NULL 2135 et_1 ALL PRIMARY NULL NULL NULL 74 tt ALL assignigdpc, NULL NULL NULL 3872 ClientID, ActualPC范围检查每条记录(索引映射:0x23)

各テブルの类型所有であるため,この出力はMySQLがすべてのテーブル,つまりすべての行の組み合わせのデカルト積を生成することを示しています。これは,各テ,ブルの行数の積を調査する必要があるため,著しく時間がかかります。このケースの場合は、この積が 74 × 2135 × 74 × 3872 = 45,268,558,720 行になります。テーブルがもっと大きければ、どのくらい時間がかかっていたか簡単に想像がつきます。

ここでの問題の1つは,カラムが同じ型とサイズで宣言されている場合に,MySQLはカラムに対してインデックスをより効率的に使用できることです。このコンテキストでは,VARCHAR字符は同じサズとして宣言されている場合,それらは同じとみなされます。tt。ActualPCCHAR (10)として宣言されており,et.EMPLOYIDCHAR (15)であるため,長さの不一致があります。

このカラム長の不一致を修正するには,ALTER TABLEを使用してActualPCを10文字から15文字に長くします。

mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);

これでtt。ActualPCet.EMPLOYIDはいずれもVARCHAR (15)になります。解释ステトメントを再度実行すると,次の結果が生成されます。

表类型possible_keys key key_len ref rows Extra tt ALL assignigdpc, NULL NULL NULL 3872 Using ClientID, where ActualPC do ALL PRIMARY NULL NULL NULL 2135检查每个记录的范围(索引映射:0x1) et_1 ALL PRIMARY NULL NULL NULL 74检查每个记录的范围(索引映射:0x1) et eq_ref PRIMARY PRIMARY 15 tt。ActualPC 1

これは完全ではありませんが,はるかに改善されています。値の積は74の係数分だけ少なくなります。このバジョンは,数秒で実行します。

2 .めの変更を実行して,tt。AssignedPC = et_1。EMPLOYIDtt。ClientID =。CUSTNMBRの比較でのカラム長の不一致を解消できます。

mysql> ALTER TABLE tt MODIFY assign表VARCHAR(15), -> MODIFY ClientID VARCHAR(15);

その変更後,解释は次に示す出力を生成します。

table type possible le_keys key key_len ref rows Extra et ALL PRIMARY NULL NULL NULL 74 tt ref assignigdpc, ActualPC 15 et. employid 52 Using ClientID, where ActualPC et_1 eq_ref PRIMARY PRIMARY 15 tt. table type possible le_keys key key_len ref rows Extra et ALL PRIMARY NULL NULL NULL 74 tt ref assignigdpc, ActualPC 15 et. employid 52 Using ClientID, where ActualPC et_1 eq_ref PRIMARY PRIMARY 15 tt。assign pc 1 do eq_ref PRIMARY PRIMARY 15 tt。ClientID 1

この時点で,クエリはほぼ可能なかぎり十分に最適化されています。残りの問題は,MySQLはデフォルトでtt。ActualPCカラムの値が均一に分布しているものと想定しますが,ttテブルにはそれが当てはまらないことです。さいわい,MySQLにキ分布を分析するように伝えることは簡単です。

mysql>解析表

追加のンデックス情報によって,結合が完全になり,解释が次の結果を生成します。

表类型potentile_keys key key_len ref rows Extra tt ALL assignnedpc NULL NULL NULL 3872 Using ClientID, where ActualPC et eq_ref PRIMARY PRIMARY 15 tt。ActualPC 1 et_1 eq_ref PRIMARY PRIMARY 15 tt。assign pc 1 do eq_ref PRIMARY PRIMARY 15 tt。ClientID 1

解释の出力のカラムは,MySQL結合オプティマMySQLザの学習による推測です。の積とクエリが返す実際の行数を比較して,数値が実際と近いかどうかをチェックしてください。数値がかなり異なる場合は,选择ステトメントでSTRAIGHT_JOINを使用し,句で異なる順序でテブルを一覧表示してみるとパフォマンスを改善できる可能性があります。

場合によっては,サブクエリで解释选择を使用するときに,デタを変更するステトメントを実行できることもあります。詳細にいては,セクション13.2.10.8 " from句内のサブクエリ"を参照してください。