解释
ステトメントは选择
ステトメントの実行プランに関する情報を提供します。
解释
は选择
ステトメントで使用される各テブルに関する情報の行を返します。これは,米ySQL がステートメントの処理中にテーブルを読み取る順番で、出力にテーブルを一覧表示します。MySQL は Nested Loop 結合メソッドを使用して、すべての結合を解決します。これは、MySQL が最初のテーブルから行を読み取り、次に 2 つめのテーブル、3 つめのテーブルというように、一致する行を見つけることを意味します。すべてのテーブルが処理されると、MySQL は選択したカラムを出力し、さらに一致する行があるテーブルが見つかるまで、テーブルリストを逆戻りします。次の行がテーブルから読み取られ、プロセスは次のテーブルに進みます。
扩展
キワドを使用すると,解释
は,解释
ステトメントに続けて显示警告
ステトメントを発行することで表示できる追加の情報を生成します。解释扩展
はフィルタ処理された
カラムも表示します。セクション8.8.3 " explain extended出力フォマット"を参照してください。
扩展
キワドと分区
キワドを,同じ解释
ステトメントで一緒に使用することはできません。
解释出力カラム
このセクションでは,解释
によって生成される出力カラムにいて説明します。あとのセクションで,类型
と额外的
カラムに関する追加情報を提供します。
解释
からの各出力行は1のテブルに関する情報を提供します。各行には,表8.1 " explain出力カラム"で要約し,次の表に詳しく説明している値が格納されます。
选择
識別子。これはクエリー内の选择
の連番です。行がほかの行の和集合結果を参照する場合に,値は零
になることがあります。この場合,表格
カラムには,<联盟
などの値が表示され,行が米
,N
>米
およびN
のid
値のある行の和集合を参照していることが示されます。选择
の種類で,次の表に示すもののいずれかになります。select_type
値意味 简单的
単純な 选择
(联盟
やサブクエリを使用しません)主要的
もっとも外側の 选择
联盟
联盟
内の2め以降の选择
ステトメント依赖联盟
联盟
内の2め以降の选择
ステトメントで,外側のクエリに依存します联盟的结果
联盟
の結果。子查询
サブクエリ内の最初の 选择
相关子查询
サブクエリ内の最初の 选择
で,外側のクエリに依存します派生的
派生テブル 选择
(从
句内のサブクエリ)物化
実体化されたサブクエリ 当前子查询
結果をキャッシュできず,外側のクエリの行ごとに再評価される必要があるサブクエリ 各种联盟
キャッシュ不可能なサブクエリ( 当前子查询
を参照してください)に属する联盟
内の2め以降のselect依赖
は一般に,相関サブクエリの使用を示します。セクション13.2.10.7 "相関サブクエリ"を参照してください。相关子查询
の評価は当前子查询
の評価とは異なります。相关子查询
の場合,その外部コンテキストの変数の異なる値の各セットにつき,一回だけサブクエリーが再評価されます。当前子查询
の場合,外部コンテキストの行ごとにサブクエリが再評価されます。サブクエリのキャッシュ可能性は,クエリ結果のキャッシュ(これに)セクション8.9.3.1 "クエリキャッシュの動作"で説明しています)と異なります。サブクエリのキャッシュは、クエリー実行中に行われ、クエリーキャッシュは、クエリーの実行が終了したあとにのみ、結果を格納するために使用されます。
出力の行で参照しているテブルの名前。これも次のいずれかの値になることがあります。
<联盟
:行は米
,N
>米
およびN
のid
値のある行の和集合を参照しています。<派生
:行はN
>N
のid
値のある行の派生テブル結果を参照しています。派生テブルは,たとえば从
句内のサブクエリの結果などになります。<子查询
:行はN
>N
のid
値のある行の実体化されたサブクエリの結果を参照しています。セクション8.2.1.18.2 "サブクエリ実体化によるサブクエリの最適化"を参照してください。
クエリでレコドが照合されるパティション。このカラムは,
分区
キワドが使用されている場合にのみ表示されます。パティション化されていないテーブルの場合、この値は零
です。セクション19.3.5 "パティションに関する情報を取得する"を参照してください。結合型。さまざまな型の説明にいては,”
解释
結合型を参照してください。possible_keys
カラムは,MySQLがこのテンデックスを示します。このカラムは解释
の出力に表示されたテブルの順序にまったく依存しません。まり,possible_keys
のキの一部は,生成されたテブルの順序で実際に使用できないことがあります。このカラムが
零
の場合は、関連する以及ンデックスがありません。この場合,在哪里
句を調査して,それがインデックス設定に適したカラムを参照しているかどうかをチェックすることで,クエリーのパフォーマンスを向上できることがあります。その場合は,適切なeンデックスを作成し,再度解释
でクエリをチェックします。セクション13.1.7 " alter table構文"を参照してください。テブルにあるンデックスを確認するには,
显示指数从
を使用します。tbl_name
关键
カラムは,MySQLが実際に使用することを決定したキ()を示します。MySQLが行をルックアップするために,いずれかのpossible_keys
ereplicationンデックスを使用することを決定した場合、キ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
カラムは,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;
前のテブルの行の組み合わせごとに,このテブルから1行ず。
系统
と常量
型以外で,これは最適な結合型です。これは,結合でインデックスのすべてのパートが使用されており、インデックスが主键
または独特的非空
ンデックスである場合に使用されます。eq_ref
は,=
演算子を使用して比較される邮箱ンデックス設定されたカラムに使用できます。比較値は,定数またはこのテブルより前に読み取られたテブルのカラムを使用する式を指定できます。次の例では,MySQLはeq_ref
結合を使用して,ref_table
を処理できます。SELECT * FROMref_table,other_table在哪里ref_table.key_column=other_table.列;SELECT * FROMref_table,other_table在哪里ref_table.key_column_part1=other_table.列和ref_table.key_column_part2= 1;
前のテーブルの行の組み合わせごとに,一致するインデックス値を持つすべての行がこのテーブルから読み取られます。
裁判
は,結合でキ,の左端のプリフィクスのみが使用される場合,またはキ,が主键
や独特的
インデックスではない場合(つまり,結合で,キー値に基づいて単一の行を選択できない場合)に使用されます。使用されているキがほんの数行にしか一致しない場合,これは適切な結合型です。裁判
は,=
または< = >
演算子を使用して比較される邮箱ンデックス設定されたカラムに使用できます。次の例では,MySQLは裁判
結合を使用して,ref_table
を処理できます。SELECT * FROMref_table在哪里key_column=expr;SELECT * FROMref_table,other_table在哪里ref_table.key_column=other_table.列;SELECT * FROMref_table,other_table在哪里ref_table.key_column_part1=other_table.列和ref_table.key_column_part2= 1;
結合は
全文
ンデックスを使用して実行されます。この結合型は,
裁判
と似ていますが,MySQLが零
値を含む行の追加検索を実行することが追加されます。この結合型の最適化は,ほとんどの場合に、サブクエリーの解決で使用されます。次の例では、MySQL はref_or_null
結合を使用して,ref_table
を処理できます。SELECT * FROMref_table在哪里key_column=expr或key_column是零;
セクション8.2.1.8 " is nullの最適化"を参照してください。
この結合型は邮箱ンデックスマ邮箱ジ最適化が使用されたことを示します。この場合,出力行の
关键
カラムには使用されたンデックスのリストが含まれ,key_len
には使用された邮箱ンデックスの最長キ邮箱パ邮箱トのリストが含まれます。詳細にいては,セクション8.2.1.4 " escンデックスマジの最適化"を参照してください。この型は,次の形式の
在
サブクエリの裁判
を置き換えます。价值(选择primary_key从single_table在哪里some_expr)
unique_subquery
は,効率化のため,サブクエリ。この結合型は
unique_subquery
に似ています。在
サブクエリを置き換えますが,次の形式のサブクエリンデックスに対して機能します。价值(选择key_column从single_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_table
、Open_frm_only
、Open_trigger_only
、Open_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。ActualPC
はCHAR (10)
として宣言されており,et.EMPLOYID
はCHAR (15)
であるため,長さの不一致があります。
このカラム長の不一致を修正するには,ALTER TABLE
を使用してActualPC
を10文字から15文字に長くします。
mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);
これでtt。ActualPC
とet.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。EMPLOYID
とtt。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句内のサブクエリ"を参照してください。