mysql では、 Explain コマンドは主に SQL ステートメントの実行計画を表示するために使用されます。このコマンドは、SQL クエリーステートメントを実行するオプティマイザーをシミュレートして、mysql がユーザーの SQL ステートメントをどのように処理するかを知ることができます。構文は「SQL ステートメントの説明」;" です。
このチュートリアルの動作環境: Windows10 システム、mysql8.0.22 バージョン、Dell G3 コンピューター。
Explain コマンドは主に、SQL ステートメントの実行計画を確認し、SQL ステートメントがインデックスを使用しているかどうか、テーブル全体のスキャンが行われているかどうかを確認するために使用されます。などを行いました。 SQL クエリ ステートメントを実行するオプティマイザをシミュレートして、MySQL がユーザー SQL ステートメントをどのように処理するかを知ることができます。
私たちの日常業務では、実行に時間がかかる SQL ステートメントを記録するために、遅いクエリを実行することがあります。これらの SQL ステートメントが見つかったからといって、作業が完了したわけではありません。場合によっては、 Explain コマンドをよく使用します。これらの SQL ステートメントのいずれかの実行計画を確認し、SQL ステートメントがインデックスを使用しているかどうか、およびフル テーブル スキャンが実行されているかどうかを確認します。これは Explain コマンドを通じて確認できます。そこで、MySQL のコストベースのオプティマイザーについて詳しく説明します。また、オプティマイザーが考慮する可能性のある多くのアクセス戦略と、SQL ステートメントの実行時にオプティマイザーがどの戦略を採用すると予想されるかについての詳細も得ることができます。
-- 实际SQL,查找用户名为Jefabc的员工 select * from emp where name = 'Jefabc'; -- 查看SQL是否使用索引,前面加上explain即可 explain select * from emp where name = 'Jefabc'
expain からの情報には、id、select_type、table、type、 possible_keys、key、key_len、ref、rows、Extra
の 10 列があります。概要の説明:
id: 選択識別子
select_type: クエリのタイプを示します。
table: 結果セットを出力するテーブル
partitions: 一致するパーティション
type: テーブルの接続タイプを示します
possible_keys: を示しますクエリ中の可能性 使用されるインデックス
key: 実際に使用されるインデックスを示します
key_len: インデックス フィールドの長さ
ref: カラムとインデックスの比較
rows: スキャン出力行数 (推定行数)
#filtered: テーブル条件によってフィルター処理された行の割合補足: 実行の説明と説明これらのフィールドについては以下で説明します 考えられる説明が表示される場合があります: 1. idSELECT 識別子。これは SELECT のクエリ シーケンス番号です。SQL の実行順序を識別するものだと理解しています。SQL は大きいものから小さいものへと実行されます。ID が同じ場合、実行は実行されません。順序は上から下です2. サブクエリの場合、ID のシリアル番号がインクリメントされ、ID 値が大きいほど優先順位が高く、より早く実行されます。#3. id が同じ場合はグループとしてみなし、上から順に実行し、どのグループでも id の値が大きいほど優先度が高く、先に実行されます。
-- 查看在研发部并且名字以Jef开头的员工,经典查询 explain select e.no, e.name from emp e left join dept d on e.dept_no = d.no where e.name like 'Jef%' and d.name = '研发部';
2. select_type
クエリ内の各選択句の型を示します。
(2) PRIMARY (サブクエリ内の最も外側のクエリ。クエリに複雑なサブパートが含まれている場合、最も外側の選択は PRIMARY としてマークされます)
(3) UNION(2 番目以降の SELECT UNION のステートメント)
(4) DEPENDENT UNION(UNION の 3 番目の SELECT ステートメント) 外部クエリに応じて 2 つ以上の SELECT ステートメント)
(5) UNION RESULT (次の結果) UNION、union ステートメントの 2 番目の select が後続のすべての select を開始します)
(6 ) SUBQUERY(サブクエリの最初の SELECT、結果は外部クエリに依存しません)
(7 ) DEPENDENT SUBQUERY(サブクエリの最初の SELECT、結果は外部クエリに依存しません)
(8) DERIVED(派生テーブルの SELECT、FROM 句のサブクエリ)
(9) UNCACHEABLE SUBQUERY (サブクエリの結果をキャッシュできないため、外部リンクの最初の行を再評価する必要があります)
3. table
テーブル名を表示します。このステップでアクセスするデータベース内 (この行のデータがどのテーブルに関するものであるかを示します)。実際のテーブル名ではない場合もあります。上記の e、d などの略語である場合もあります。また、いくつかのステップの実行結果
テーブル アクセス メソッドは、MySQL がテーブル内で必要な行を見つける方法を示し、「アクセス タイプ」とも呼ばれます。
ALL: フル テーブル スキャン、 MySQL はテーブル全体を走査して一致する行を見つけます
index: フル インデックス スキャン、インデックスと ALL の違いは、インデックス タイプがインデックス ツリーのみを走査することです
range: 内の行のみを取得します指定された範囲では、行を選択するためのインデックスを使用します。
ref: 上の表の接続一致条件、つまり、インデックス列の値を検索するためにどの列または定数が使用されるかを示します
eq_ref: ref と似ていますが、使用方法が異なります インデックスは一意のインデックスです。各インデックス キー値に対して、テーブル内の 1 つのレコードのみが一致します。簡単に言うと、主キーまたは一意のキーが関連付けとして使用されます複数テーブル接続の条件
const, system: MySQL の場合 クエリの一部を最適化し定数に変換する場合、これらのタイプのアクセスを使用します。主キーが where リストに配置されている場合、MySQL はクエリを定数に変換できます。System は const 型の特殊なケースです。クエリされたテーブルに 1 行しかない場合は、system
NULL: MySQL を使用してください。最適化中 ステートメントはプロセス中に分解され、実行中にテーブルやインデックスにアクセスする必要さえありません。たとえば、インデックス列からの最小値の選択は、別のインデックス検索を通じて完了できます。
指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)
该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。
如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询
key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中
如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)
不损失精确性的情况下,长度越短越好
列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
该列包含MySQL解决查询的详细信息,有以下几种情况:
Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by
Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”
-- 测试Extra的filesort explain select * from emp order by name;
Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
Impossible where:这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。
Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
No tables used:Query语句中使用from dual 或不含任何from子句
-- explain select now() from dual;
总结:
• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
• EXPLAIN不考虑各种Cache
• EXPLAIN不能显示MySQL在执行查询时所作的优化工作
• 部分统计信息是估算的,并非精确值
• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。
通过收集统计信息不可能存在结果
推荐学习:mysql视频教程
以上がmysqlでのexplainの使い方は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。