Maison  >  Article  >  base de données  >  A quoi sert expliquer dans MySQL

A quoi sert expliquer dans MySQL

WBOY
WBOYoriginal
2022-03-07 10:59:556244parcourir

Dans mysql, la commande expliquer est principalement utilisée pour visualiser le plan d'exécution de l'instruction SQL. Cette commande peut simuler l'optimiseur pour exécuter l'instruction de requête SQL, afin de savoir comment mysql traite l'instruction SQL de l'utilisateur. expliquer l'instruction SQL ;".

A quoi sert expliquer dans MySQL

L'environnement d'exploitation de ce tutoriel : système windows10, version mysql8.0.22, ordinateur Dell G3.

À quoi sert expliquer dans MySQL ?

La commande expliquer est principalement utilisée pour vérifier le plan d'exécution de l'instruction SQL, vérifier si l'instruction SQL utilise des index, si une analyse complète de la table est effectuée, etc. Il peut simuler l'optimiseur pour exécuter des instructions de requête SQL afin de savoir comment MySQL gère les instructions SQL des utilisateurs.

Dans le travail quotidien, nous exécutons parfois des requêtes lentes pour enregistrer certaines instructions SQL qui prennent beaucoup de temps à s'exécuter. Trouver ces instructions SQL ne signifie pas que nous avons terminé. Parfois, nous utilisons souvent la commande expliquer pour afficher ces instructions SQL. Le plan d'exécution de l'instruction SQL, si l'instruction SQL utilise des index et si une analyse complète de la table est effectuée, peuvent être vérifiés via la commande expliquer. Nous approfondissons donc l'optimiseur basé sur les coûts de MySQL, et nous pouvons également obtenir des détails sur de nombreuses stratégies d'accès qui peuvent être prises en compte par l'optimiseur, et sur les stratégies qu'il devrait adopter lors de l'exécution d'une instruction SQL.

-- 实际SQL,查找用户名为Jefabc的员工
select * from emp where name = 'Jefabc';
-- 查看SQL是否使用索引,前面加上explain即可
explain select * from emp where name = 'Jefabc'

Expain a 10 colonnes d'informations, à savoir id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra

Description récapitulative :

id : sélectionnez l'identifiant

select_type : indique le type de requête.

table : La table qui génère le jeu de résultats

partitions : Partitions correspondantes

type : Représente le type de connexion de la table

possible_keys : Représente les index qui peuvent être utilisés lors de l'interrogation

key : Représente l'index réel utilisé

key_len : La longueur du champ d'index

ref : comparaison des colonnes et des index

rows : le nombre de lignes analysées (nombre estimé de lignes)

filtered : le pourcentage de lignes filtrées par conditions de table

Extra : description et explication de l'exécution

Voici une explication possible de l'apparition de ces champs :

1 id

identifiant SELECT. Il s'agit du numéro de séquence de requête de SELECT

Ma compréhension est l'identification de l'ordre d'exécution de SQL. SQL est exécuté de grand à petit

1 Lorsque l'identifiant est le même, l'ordre d'exécution est de haut en bas

. 2. S'il s'agit d'une sous-requête, le numéro de série de l'identifiant augmentera. Plus la valeur de l'identifiant est grande, plus la priorité est élevée et plus elle sera exécutée tôt. 3. Si l'identifiant est le même, il peut être considéré comme un. group et exécuté séquentiellement de haut en bas ; dans tous les groupes, plus la valeur id est grande, plus la priorité est élevée, plus elle sera exécutée tôt

-- 查看在研发部并且名字以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

Indique le type de chaque clause select. dans la requête

(1) SIMPLE (SELECT simple, n'utilise pas UNION ou sous-requête, etc.)

(2) PRIMARY (La requête la plus externe dans la sous-requête, si la requête contient des sous-parties complexes, la sélection la plus externe est marquée comme PRIMARY)

(3) UNION (la deuxième instruction SELECT ou suivante dans UNION)

(4) DEPENDENT UNION (la deuxième instruction SELECT ou suivante dans UNION, en fonction de la requête externe)

(5) UNION RESULT ( le résultat de UNION, la deuxième sélection dans l'instruction union démarre toutes les sélections suivantes)

(6) SOUS-REQUÊTE (le premier SELECT dans la sous-requête, le résultat ne dépend pas de la requête externe)

(7) SOUS-REQUÊTE DÉPENDANTE (la premier SELECT dans la sous-requête, dépend de la requête externe)

(8) DERIVED( SELECT de la table dérivée, sous-requête de la clause FROM)

(9) UNCACHEABLE SUBQUERY (Les résultats d'une sous-requête ne peuvent pas être mis en cache, et le la première ligne du lien externe doit être réévaluée)

3. Tableau

Affiche les résultats de cette étape Accédez au nom de la table dans la base de données (montrant à quelle table les données de cette ligne font référence). vrai nom de la table, il peut s'agir de l'abréviation, telle que e, d ci-dessus, ou de l'abréviation du résultat de l'exécution de quelle étape

4. Tapez

La méthode d'accès à la table indique la manière dont MySQL trouve le requis lignes du tableau, également appelées « type d'accès ».

Les types couramment utilisés sont : ALL, index, range, ref, eq_ref, const, system, NULL (de gauche à droite, performances de mauvaise à bonne)

ALL : analyse complète de la table, MySQL parcourra toute la table pour trouver une correspondance Les lignes

index : Full Index Scan, la différence entre index et ALL est que le type d'index ne traverse que l'arborescence d'index

range : récupère uniquement les lignes dans une plage donnée, utilise un index pour sélectionner les lignes

ref : représente les conditions de correspondance de connexion du tableau ci-dessus, c'est-à-dire quelles colonnes ou constantes sont utilisées pour trouver la valeur sur la colonne d'index

eq_ref : Semblable à ref, la différence est que l'index utilisé est un index unique pour chaque index. valeur de clé, un seul enregistrement dans la table correspond. Pour faire simple, c'est-à-dire en utilisant une clé primaire ou une clé unique comme condition d'association dans les connexions multi-tables

const, système : lorsque MySQL optimise une certaine partie de la requête et le convertit en constante, utilisez ces types d'accès. Si la clé primaire est placée dans la liste Where, MySQL peut convertir la requête en constante. System est un cas particulier du type const. Lorsque la table de requête n'a qu'une seule ligne, utilisez system

NULL : MySQL décompose l'instruction pendant. Dans le processus d'optimisation, il n'est même pas nécessaire d'accéder aux tables ou aux index pendant l'exécution. Par exemple, la sélection de la valeur minimale dans une colonne d'index peut être effectuée via une recherche d'index distincte.

五、possible_keys

指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)

该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。

如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询

六、Key

key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中

如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

七、key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)

不损失精确性的情况下,长度越短越好 

八、ref

列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

九、rows

 估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

十、Extra

该列包含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视频教程

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