Académique Documents
Professionnel Documents
Culture Documents
The SQL EXPLAIN command (or its synonym DESCRIBE) describes the plan for
executing a query, based in particular on the statistics of the tables and
their indexes. Place the word EXPLAIN at the beginning of the query:
EXPLAIN SELECT * FROM CLIENT WHERE name like ’ab%’\G
There is a system variable that after each EXPLAIN evaluates the cost of the parsed query. This is the
Last_query_cost variable:
+--------------------------+----------+
| Variable_name | Value |
+--------------------------+----------+
| Last_query_cost | 1.199000 |
| Last_query_partial_plans | 1 |
+--------------------------+----------+
The cost of the last query analyzed is 1.199000. The advantage of this variable is that it evaluates the
cost of a query without imposing its execution. The method of calculating the displayed value is rather
obscure, but it remains interesting to follow its evolution after each modification and EXPLAIN of a
request, if only to succeed in minimizing it.
https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
Column Meaning
table Table à laquelle la ligne est associée. Peut aussi avoir l’une des valeurs suivantes :
<unionM,N> : la ligne fait référence à l’union de deux lignes, dont les id
respectifs se réfèrent aux colonnes M et N.
<derivedN> : la ligne se réfère au résultat de la table dérivée ayant comme id
la colonne N. Une table dérivée peut résulter, par exemple, de la sous-requête d’une
clause FROM.
<subqueryN> : la ligne fait référence à la table résultant d’une sous-requête
matérialisée ayant pour id la colonne N.
type Type de jointure. Les différents types de jointures possibles sont les suivants :
system : la table ne possède qu’une ligne et il s’agit d’une table système. C’est
un cas particulier du type const vu ci-après.
const : la table n’a qu’une ligne impliquée dans la requête, cette ligne est lue en
début de traitement.
eq_ref : une seule ligne est mise en correspondance avec les lignes des autres
tables en jointure. Après system et const, c’est le meilleur cas de figure
possible.
ref : toutes les lignes de la table mises en correspondance sont lues en s’appuyant
sur l’index, bien que plusieurs résultats soient possibles. La jointure ne peut
sélectionner qu’une seule ligne pour chaque valeur de l’index. Par conséquent, une
jointure de type ref reste performante à condition que les lignes mises en
correspondance pour chaque valeur de l’index ne soient pas trop nombreuses.
fulltext : la jointure s’appuie sur un index plein texte.
ref_or_null : comparable à ref, mais avec en plus une recherche
spécifique pour les lignes ayant une valeur NULL.
index_merge : ce type de jointure indique qu’une optimisation de type
merge est mise en œuvre. Celle-ci consiste à utiliser un ou plusieurs index sur
plusieurs plages de valeurs puis à fusionner les résultats en un seul.
unique_subquery : ce type se substitue à ref pour certaines sous-
requêtes dont le résultat est soumis à une clause IN. Dans ce cas, l’optimiseur,
quand il le peut, remplace la sous-requête par la recherche directe d’un index pour
plus d’efficacité. Cela se produit quand, par exemple, la sous-requête d’origine
renvoie comme résultat une liste de clés primaires.
index_subquery : comparable à unique_subquery, à
l’exception que le résultat de la sous-requête n’est pas une liste de clés primaires,
mais une liste d’index qui renvoient donc potentiellement plusieurs résultats pour
chaque valeur de l’index.
range : seules les lignes correspondant à un intervalle donné sont parcourues.
En complément, la colonne key indique quel index est utilisé. La valeur affichée
dans la colonne ref est toujours NULL dans ce cas.
index : identique au type ALL ci-après, si ce n’est que l’index est parcouru.
Cela se produit dans deux cas. 1) Les informations contenues dans l’index suffisent
à la requête et il n’est donc pas nécessaire de lire les données de la table. 2) Toutes
les données de la table sont lues, mais elles sont parcourues dans l’ordre de l’index,
afin par exemple de faire l’économie d’un deuxième tri commandé par un ORDER
BY.
ALL : toute la table est parcourue, c’est le cas le plus défavorable.
key Parmi les index possibles, celui qui est choisi par l’optimiseur.