Maison  >  Article  >  base de données  >  Quel est le rôle de MySQL expliquer ?

Quel est le rôle de MySQL expliquer ?

coldplay.xixi
coldplay.xixioriginal
2020-06-29 16:10:142720parcourir

La fonction de mysql expliquer est de simuler la façon dont l'optimiseur Mysql exécute les instructions de requête SQL, afin de savoir comment Mysql traite les instructions SQL de l'utilisateur, d'améliorer l'efficacité de la récupération des données et de réduire le coût d'E/S de la base de données.

Quel est le rôle de MySQL expliquer ?

La fonction de mysql expliquer est :

Simuler la façon dont l'optimiseur Mysql exécute les instructions de requête SQL, afin de savoir comment Mysql traite vos instructions SQL. Analysez les goulots d'étranglement des performances de vos instructions de requête ou de vos structures de table.

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) colonne d'identifiant :

(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

Recommandations d'apprentissage associées : tutoriel vidéo MySQL

(2) colonne select_type : Type d'opération de lecture de données

 1. SIMPLE : requête de sélection simple, SQL ne contient pas de sous-requêtes ni UNION.

2. PRIMARY : La requête contient une partie de sous-requête complexe et la requête la plus externe est marquée comme PRIMARY

3. SOUS-REQUÊTE : La sous-requête

est incluse dans la liste de sélection ou WHERE

4. DERIVED : Les sous-requêtes contenues dans la liste FROM seront marquées comme DERIVED (table dérivée) exécutera récursivement ces sous-requêtes et placera l'ensemble de résultats dans la table à temps zéro.

5. UNION : Si le deuxième SELECT apparaît après UNION, il sera marqué comme UNION ; si UNION est inclus dans la sous-requête de la clause FROM, le SELECT externe sera marqué comme DERIVED

 6. RÉSULTAT UNION : Sélectionnez le résultat obtenu à partir de la table UNION

(3) colonne de table : de quelle table porte la ligne de données

( 4) colonne de type : type d'accès du meilleur au pire système > eq_ref > ref > index > : La table n'a qu'un seul enregistrement (égal à la table système). Il s'agit d'un cas particulier de type const et n'apparaît pas dans les affaires normales.

2,

 : Rechercher des données une fois dans l'index. Ce type est principalement utilisé pour comparer une clé primaire ou un index unique. Parce qu'il ne correspond qu'à une seule ligne de données, il est très rapide s'il s'agit de la clé primaire ; est placé après l'instruction WHERE, Mysql peut convertir la requête en constante. system

3.

 : Analyse d'index unique Pour chaque clé d'index, un seul enregistrement dans la table lui correspond. Couramment observé dans les analyses de clé primaire ou d’index unique. const

4.

 : Analyse d'index non unique, renvoie toutes les lignes qui correspondent à une seule valeur. Il s'agit essentiellement d'un accès à l'index. Elle renvoie toutes les lignes qui correspondent à une seule valeur, ce qui signifie qu'elle peut contenir plusieurs éléments. des données qui remplissent les conditions sont trouvées, il s’agit donc d’un mélange de recherche et d’analyse. eq_ref

Explication détaillée : ce type signifie que MySQL trouvera rapidement un index qualifié basé sur un algorithme spécifique, au lieu d'analyser et de juger toutes les données de l'index une par une, ce que vous appelez habituellement Comprendre l'utilisation de les requêtes d'index récupéreront les données plus rapidement. Pour réaliser ce type de recherche, des index sont nécessaires. Pour mettre en œuvre cet algorithme de recherche rapide, l'index doit répondre à une structure de données spécifique. Pour faire simple, les données du champ index doivent l'être pour réaliser ce type de recherche et utiliser l'index.

ref5,

 : récupérez uniquement les lignes d'une plage donnée et utilisez un index pour sélectionner les lignes. La colonne clé indique quel index a été utilisé. Généralement, les requêtes telles que between, 95ec6993dc754240360e28e0de8de30a et in apparaissent dans votre instruction WHERE. Ce type d'analyse de plage donnée est meilleur qu'une analyse de table complète. Parce qu'il suffit de commencer à un certain point de l'index et de se terminer à un autre point, sans analyser l'intégralité de l'index.

6.

 : L'analyse complète de l'index parcourt l'arborescence de l'index (index : ce type signifie que MySQL analysera l'intégralité de l'index. Pour utiliser ce type d'index, analysez l'index et il n'y a pas d'exigences particulières. Tant qu'il s'agit d'un index ou d'une partie d'un index composite, MySQL peut utiliser une analyse de type index. Cependant, l'inconvénient est qu'il n'est pas efficace pour rechercher une par une depuis les premières données de l'index. données jusqu'à ce qu'un index répondant aux conditions de jugement soit trouvé). range

7.

: Analyse complète de la table Obtenez des données à partir du disque autant que possible. index

(5) colonne possible_keys ALL : Affiche un ou plusieurs index pouvant être appliqués à cette table. Si un index existe pour les champs impliqués dans la requête, l'index sera répertorié, mais il ne pourra pas être réellement utilisé par la requête.

(6) colonne de clés : L'index réel utilisé. Si NULL, aucun index n'est utilisé. Si un index de couverture est utilisé dans la requête, l'index apparaît uniquement dans la liste des clés. Index de couverture : Les champs après sélection sont cohérents avec le nombre de champs que nous indexons.

(7) colonne ken_len : représente le nombre d'octets utilisés dans l'index. Cette colonne peut être utilisée pour calculer la longueur de l'index utilisée dans la requête. Plus la longueur est courte, mieux c'est sans perdre en précision. La valeur affichée par key_len est la longueur maximale possible du champ d'index, et non la longueur réelle utilisée. Autrement dit, key_len est calculée en fonction de la définition de la table et n'est pas extraite de la table.

(八)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:

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn