mysql Explain の機能は、Mysql オプティマイザーが SQL クエリ ステートメントを実行する方法をシミュレートし、Mysql がユーザーの SQL ステートメントをどのように処理し、データ取得効率を向上させ、データベースの IO コストを削減するかを知ることです。
mysql Explain の機能は次のとおりです:
MySQL オプティマイザーが SQL クエリ ステートメントを実行する方法をシミュレートします。 Mysql が SQL ステートメントをどのように処理するかを知っています。クエリ ステートメントまたはテーブル構造のパフォーマンスのボトルネックを分析します。
mysql> explain select * from tb_user; +----+-------------+---------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+------+---------------+------+---------+------+------+-------+ | 1 | SIMPLE | tb_user | ALL | NULL | NULL | NULL | NULL | 1 | NULL | +----+-------------+---------+------+---------------+------+---------+------+------+-------+
(1) ID 列:
(1)、id 相同执行顺序由上到下 mysql> explain -> SELECT*FROM tb_order tb1 -> LEFT JOIN tb_product tb2 ON tb1.tb_product_id = tb2.id -> LEFT JOIN tb_user tb3 ON tb1.tb_user_id = tb3.id; +----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+ | 1 | SIMPLE | tb1 | ALL | NULL | NULL | NULL | NULL | 1 | NULL | | 1 | SIMPLE | tb2 | eq_ref | PRIMARY | PRIMARY | 4 | product.tb1.tb_product_id | 1 | NULL | | 1 | SIMPLE | tb3 | eq_ref | PRIMARY | PRIMARY | 4 | product.tb1.tb_user_id | 1 | NULL | +----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+ (2)、如果是子查询,id序号会自增,id值越大优先级就越高,越先被执行。 mysql> EXPLAIN -> select * from tb_product tb1 where tb1.id = (select tb_product_id from tb_order tb2 where id = tb2.id =1); +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+ | 1 | PRIMARY | tb1 | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL | | 2 | SUBQUERY | tb2 | ALL | NULL | NULL | NULL | NULL | 1 | Using where | +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+ (3)、id 相同与不同,同时存在 mysql> EXPLAIN -> select * from(select * from tb_order tb1 where tb1.id =1) s1,tb_user tb2 where s1.tb_user_id = tb2.id; +----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+ | 1 | PRIMARY | <derived2> | system | NULL | NULL | NULL | NULL | 1 | NULL | | 1 | PRIMARY | tb2 | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL | | 2 | DERIVED | tb1 | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL | +----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+ derived2:衍生表 2表示衍生的是id=2的表 tb1
関連学習の推奨事項: mysql ビデオ チュートリアル
# (2) select_type カラム: データ読み取り操作の操作タイプ
1. SIMPLE: 単純な選択クエリ。SQL にはサブクエリや UNION が含まれません。
2. PRIMARY: クエリには複雑なサブクエリ部分が含まれており、最も外側のクエリは PRIMARY
としてマークされます。 3. SUBQUERY: サブクエリは選択リストまたは WHERE リストに含まれています
4. DERIVED: FROM リストに含まれるサブクエリは DERIVED (派生テーブル) としてマークされ、MYSQL はこれらのサブクエリを再帰的に実行し、結果セットをゼロタイム テーブルに置きます。
5. UNION: 2 番目の SELECT が UNION の後に出現する場合、UNION としてマークされます; UNION が FROM 句のサブクエリに含まれる場合、外側の SELECT は DERIVED
6. UNION RESULT:UNIONテーブルから得られた結果を選択します
(3)テーブル列:どのテーブルのデータ行が約
( 4) タイプ列: アクセスタイプ 良いシステムから悪いシステムへ > const > eq_ref > ref > 範囲 > インデックス > ALL
1, system
: テーブルにはレコードが 1 つだけあります (システム テーブルと同じ) これは const 型の特殊なケースであり、通常の業務では発生しません。
2, const
: インデックスを通じてデータを 1 回検索します。このタイプは主に主キーまたは一意のインデックスを比較するために使用されます。データの 1 行のみと一致するため、非常に高速です。 ; 主キーが WHERE ステートメントの後に配置されている場合、Mysql はクエリを定数に変換できます。
3、eq_ref
: 一意のインデックス スキャン。インデックス キーごとに、テーブル内の 1 つのレコードのみがそれに一致します。主キーまたは一意のインデックスのスキャンでよく見られます。
4, ref
: 非一意インデックス スキャンは、単一の値に一致するすべての行を返します。これは本質的にインデックス アクセスです。単一の値に一致するすべての行を返します。条件を満たすデータが複数見つかる場合があるため、検索とスキャンを組み合わせて実行します。
詳細な説明: このタイプは、mysql がインデックス内のすべてのデータを 1 つずつスキャンして判断するのではなく、特定のアルゴリズムに基づいて適格なインデックスを迅速に見つけることを意味します。これは通常、インデックスの使用を理解することと呼ばれるものです。インデックスクエリはデータをより速く取得します。この種の検索を実現するにはインデックスが必要ですが、この高速検索アルゴリズムを実装するには、インデックスが特定のデータ構造を満たしている必要があります。簡単に言うと、このタイプの検索を実現し、インデックスを使用するには、インデックス フィールド内のデータが必要です。
5, range
: 指定された範囲内の行のみを取得し、インデックスを使用して行を選択します。キー列には、どのインデックスが使用されたかが表示されます。一般に、between、f539a70d3ea090bac4faa80192f58ccc、in などのクエリは WHERE ステートメントに現れます。この種の指定された範囲スキャンは、テーブル全体のスキャンよりも優れています。インデックス全体をスキャンする必要がなく、インデックス内の特定のポイントで開始し、別のポイントで終了するだけでよいためです。
6, index
: 完全インデックス スキャンは、インデックス ツリーをスキャンして走査します (インデックス: このタイプは、mysql がインデックス全体をスキャンすることを意味します。このタイプのインデックスを使用したい場合は、このインデックスに対する特別な要件はありません。インデックスまたは複合インデックスの一部である限り、mysql はインデックス タイプの方法を使用してスキャンできます。ただし、効率が高くないという欠点があります。Mysql は最初から開始されます。インデックス内のデータを検索し、判定条件を満たすインデックスが見つかるまで最後のデータを1つずつ検索します。
7, ALL
: テーブル全体をスキャンしてディスクからデータを取得し、数百万のデータ ALL タイプのデータを可能な限り最適化します。
(5) possible_keys 列 : このテーブルに適用できる 1 つ以上のインデックスを表示します。クエリに関係するフィールドにインデックスが存在する場合、そのインデックスはリストされますが、実際にはクエリで使用されない場合があります。
(6) キー列: 使用される実際のインデックス。 NULL の場合、インデックスは使用されません。クエリでカバリング インデックスが使用されている場合、インデックスはキー リストにのみ表示されます。カバーインデックス: 選択後のフィールドは、インデックスを作成するフィールドの数と一致します。
(7) ken_len カラム: はインデックスで使用されるバイト数を示し、クエリで使用されるインデックスの長さを計算するために使用できます。長さが短いほど、精度を損なうことなく良好になります。 key_len によって表示される値は、インデックス フィールドの可能な最大長であり、実際に使用される長さではありません。つまり、key_len はテーブル定義に基づいて計算され、テーブルから取得されるものではありません。
(八)ref列:显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。
(九)rows列(每张表有多少行被优化器查询):根据表统计信息及索引选用的情况,大致估算找到所需记录需要读取的行数。
(十)Extra列:扩展属性,但是很重要的信息。
1、 Using filesort(文件排序):mysql无法按照表内既定的索引顺序进行读取。 mysql> explain select order_number from tb_order order by order_money; +----+-------------+----------+------+---------------+------+---------+------+------+----------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+------+---------------+------+---------+------+------+----------------+ | 1 | SIMPLE | tb_order | ALL | NULL | NULL | NULL | NULL | 1 | Using filesort | +----+-------------+----------+------+---------------+------+---------+------+------+----------------+ 1 row in set (0.00 sec) 说明:order_number是表内的一个唯一索引列,但是order by 没有使用该索引列排序,所以mysql使用不得不另起一列进行排序。 2、Using temporary:Mysql使用了临时表保存中间结果,常见于排序order by 和分组查询 group by。 mysql> explain select order_number from tb_order group by order_money; +----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+ | 1 | SIMPLE | tb_order | ALL | NULL | NULL | NULL | NULL | 1 | Using temporary; Using filesort | +----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+ 1 row in set (0.00 sec) 3、Using index 表示相应的select 操作使用了覆盖索引,避免访问了表的数据行,效率不错。 如果同时出现Using where ,表明索引被用来执行索引键值的查找。 如果没有同时出现using where 表明索引用来读取数据而非执行查找动作。 mysql> explain select order_number from tb_order group by order_number; +----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+ | 1 | SIMPLE | tb_order | index | index_order_number | index_order_number | 99 | NULL | 1 | Using index | +----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+ 1 row in set (0.00 sec) 4、Using where 查找 5、Using join buffer :表示当前sql使用了连接缓存。 6、impossible where :where 字句 总是false ,mysql 无法获取数据行。 7、select tables optimized away: 8、distinct:
以上がmysql Explainの役割は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。