Maison  >  Article  >  base de données  >  expliquer l'utilisation et l'analyse des résultats dans MySQL (explication détaillée)

expliquer l'utilisation et l'analyse des résultats dans MySQL (explication détaillée)

青灯夜游
青灯夜游avant
2020-07-07 16:04:1313166parcourir

expliquer l'utilisation et l'analyse des résultats dans MySQL (explication détaillée)

1. Introduction à EXPLAIN

L'utilisation du mot-clé EXPLAIN peut simuler l'exécution d'instructions de requête SQL par l'optimiseur, 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.
Grâce à EXPLAIN, nous pouvons analyser les résultats suivants :

  • La séquence de lecture de la table
  • Le type d'opération de lecture des données
  • Quels index peuvent être utilisés
  • Quels index sont réellement utilisés
  • Références entre les tables
  • Combien de lignes de chaque table sont interrogées par l'optimiseur

Utilisé comme suit :

EXPLAIN +Instruction SQL

EXPLAIN SELECT * FROM t1

Informations contenues dans le plan d'exécution
expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)

2 . La signification de chaque champ dans le plan d'exécution

2.1 id

Le numéro de séquence de la requête de sélection, y compris un ensemble de nombres, indiquant l'ordre dans lequel la sélection est effectuée. des clauses ou des tables d'opérations sont exécutées dans la requête

résultats id

  • id est le même, l'exécution l'ordre est de haut en bas


    expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)
    [Résumé] L'ordre de chargement du tableau est tel qu'indiqué dans la colonne du tableau ci-dessus : t1 t3 t2

  • id est différent. S'il s'agit d'une sous-requête, le numéro de série de l'id augmentera. Plus la valeur de l'id est élevée, plus la priorité est élevée, plus elle est exécutée tôt

<.>

expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)

l'identifiant est le même mais différent, et

  • existe en même temps que ci-dessus Comme le montre la figure, lorsque l'identifiant est 1, le tableau affiche expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée), qui fait référence à la table d'identifiant 2, qui est la table dérivée de la table t3.
    <derived2></derived2>
  • 2.2 select_type

Les valeurs courantes et couramment utilisées sont les suivantes :


sont utilisées pour représenter le type de requête respectivement, principalement pour distinguer entre les requêtes complexes ordinaires telles que les requêtes, les requêtes d'union, les sous-requêtes, etc. expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)

    SIMPLE
  • , interrogation

    简单的select查询不包含子查询或者UNION

  • PRIMAIRE Si
  • la sous-partie interroge,

    包含任何复杂的 最外层查询则被标记为PRIMARY

  • SOUS-REQUÊTE
  • 在SELECT或WHERE列表中包含了子查询

  • DERIVED Si
  • (dérivé) est inclus dans la liste FROM, MySQL exécutera récursivement ces sous-requêtes et remplacera

    子查询被标记为DERIVED结果放在临时表

  • 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
  • UNION RESULT SELECT pour obtenir le résultat de la table UNION
  • Table 2.3

fait référence à la table actuellement exécutée

Type 2.4

type indique quel type est utilisé dans la requête. Les types inclus dans type incluent les types suivants :


Du plus L'ordre du meilleur au pire. est : expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)

system > const > eq_ref > ref > range > index > all

De manière générale, il faut s'assurer que la requête atteint au moins le niveau range, et de préférence atteint la ref.

  • system La table n'a qu'une seule ligne d'enregistrements (égale à la table système). Il s'agit d'une colonne spéciale de type const. Elle n'apparaît généralement pas.
  • signifie transmettre l'index une fois. Je viens de le trouver, const est utilisé pour comparer la clé primaire ou l'index unique. Comme une seule ligne de données est mise en correspondance, cela est très rapide. Si vous placez la clé primaire dans la liste Where, MySQL peut convertir la requête en constante. const
    expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)Effectuez d'abord une sous-requête pour obtenir un résultat de la table temporaire d1. La condition de sous-requête est id = 1, qui est une constante, donc le type est const. un seul enregistrement, donc le type est système.
  • Analyse d'index unique, pour chaque clé d'index, un seul enregistrement dans la table lui correspond. Généralement observé dans les analyses de clé primaire ou d'index unique eq_ref
  • Les analyses d'index non uniques renvoient toutes les lignes qui correspondent à une seule valeur. Il s'agit essentiellement d'un accès à l'index, qui renvoie toutes les lignes qui correspondent à une seule valeur. cependant, il peut trouver plusieurs lignes correspondantes, il doit donc s'agir d'un hybride de recherche et d'analyse. ref
    expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)
  • Récupérez uniquement les lignes dans une plage donnée, utilisez un index pour sélectionner les lignes, la colonne clé indique quel index est utilisé, généralement entre et < apparaissent dans votre instruction Where ;, >, in, etc., cette analyse de plage d'index est meilleure qu'une analyse de table complète, car elle doit uniquement commencer à un certain point de l'index et se terminer à un autre point, sans analyser l'intégralité de l'index. range
    expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)
  • Full Index Scan, la différence entre Index et All est que le type d'index ne traverse que l'arborescence d'index. C'est généralement plus rapide que ALL car les fichiers d'index sont généralement plus petits que les fichiers de données. (C'est-à-dire que bien que all et Index lisent tous deux la table entière, l'index est lu à partir de l'index et tout est lu à partir du disque dur) index
    expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)id est la clé primaire, donc il y a un index de clé primaire
  • L'analyse complète de la table parcourra toute la table pour trouver les lignes correspondantes all
    expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)
2,5 clés et clés possibles

display Un ou plusieurs index pouvant être appliqués à cette table. Si un index existe sur le champ impliqué dans la requête, l'index sera répertorié possible_keys mais ne pourra pas être réellement utilisé par la requête .

key

    L'index réel utilisé S'il est NULL, aucun index n'est utilisé. (Les raisons possibles incluent l'absence de création d'index ou l'échec de l'index)

  • expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)
  • Si
  • est utilisé dans la requête (le champ à interroger après la sélection est exactement le même que le champ d'index créé ), alors l'index n'apparaît que dans la liste des clés 覆盖索引
    expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)
    expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)
2.6 key_len

représente le nombre d'octets utilisés dans l'index , qui peut être calculé via cette colonne La longueur de l'index utilisé dans la requête, en

. 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 non extraite de la table. 不损失精确性的情况下,长度越短越好
expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)

2.7 ref

On utilise la colonne affichant l'index, de préférence une constante si possible. Quelles colonnes ou constantes sont utilisées pour trouver la valeur sur la colonne indexée.


expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)

2,8 lignes

En fonction des statistiques de la table et de la sélection de l'index, estimez approximativement le nombre de lignes à lire pour trouver l'enregistrement requis, c'est-à-dire utilisez Moins il y en a, mieux c'est


expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)

2.9 Extra

Contient des informations supplémentaires importantes qui ne conviennent pas à une utilisation explicite dans d'autres colonnes

2.9.1 Utilisation du tri de fichiers ( évasion étroite)

indique que mysql utilisera un index externe pour trier les données au lieu de les lire dans l'ordre d'index dans la table. L'opération de tri qui ne peut pas être effectuée à l'aide des index dans MySQL est appelée « tri de fichiers ».


expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)

2.9.2 Using temporary(十死无生)

使用了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。
expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)

2.9.3 Using index(发财了)

表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。
expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)
expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)

2.9.4 Using where

表明使用了where过滤

2.9.5 Using join buffer

表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些。

2.9.6 impossible where

where子句的值总是false,不能用来获取任何元组

SELECT * FROM t_user WHERE id = '1' and id = '2'

2.9.7 select tables optimized away

在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。

2.9.8 distinct

优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

3. 实例分析

expliquer lutilisation et lanalyse des résultats dans MySQL (explication détaillée)

  • 执行顺序1:select_type为UNION,说明第四个select是UNION里的第二个select,最先执行【select name,id from t2】
  • 执行顺序2:id为3,是整个查询中第三个select的一部分。因查询包含在from中,所以为DERIVED【select id,name from t1 where other_column=’’】
  • 执行顺序3:select列表中的子查询select_type为subquery,为整个查询中的第二个select【select id from t3】
  • 执行顺序4:id列为1,表示是UNION里的第一个select,select_type列的primary表示该查询为外层查询,table列被标记为<derived3></derived3>,表示查询结果来自一个衍生表,其中derived3中的3代表该查询衍生自第三个select查询,即id为3的select。【select d1.name …】
  • 执行顺序5:代表从UNION的临时表中读取行的阶段,table列的表示用第一个和第四个select的结果进行UNION操作。【两个结果union操作】

推荐学习: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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer