Partage de technologie

Explication détaillée de l'instruction Mysql Explain et exemple d'affichage

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Tout d’abord, présentez brièvement SQL :

Le langage SQL est divisé en quatre catégories : le langage de requête de données DQL, le langage de manipulation de données DML, le langage de définition de données DDL et le langage de contrôle de données DCL.

1. Langage de requête de données DQL
La structure de base du langage de requête de données DQL est un bloc de requête composé de la clause SELECT, de la clause FROM et de la clause WHERE : SELECT <table de nom de champ> FROM <nom de table ou de vue> WHERE <conditions de requête>

2. Langage de manipulation de données DML
Il existe trois formes principales de langage de manipulation de données DML :
1) Insérer : INSÉRER
2) Mise à jour : MISE À JOUR
3) Supprimer : SUPPRIMER

3. Langage de définition de données DDL
Le langage de définition de données DDL est utilisé pour créer divers objets dans la base de données ----- tables, vues, index, synonymes, clusters, etc., tels que : CREATE TABLE / VIEW / INDEX / SYN / CLUSTER | . Les opérations DDL sont soumises implicitement ! Impossible de revenir en arrière

4. DCL du langage de contrôle des données
Le langage de contrôle des données DCL est utilisé pour accorder ou révoquer certains privilèges pour accéder à la base de données, contrôler l'heure et l'effet des transactions de manipulation de base de données et surveiller la base de données. comme:
1) SUBVENTION : Autorisation.
2) ROLLBACK [WORK] TO [SAVEPOINT] : revenez à un certain point. Rollback---ROLLBACK La commande rollback ramène l'état de la base de données au dernier état soumis. Son format est : SQL>ROLLBACK ;
3) COMMIT [TRAVAIL] : Soumettre. Lors des opérations d'insertion, de suppression et de modification de la base de données, la transaction n'est terminée que lorsqu'elle est soumise à la base de données. Avant que la transaction ne soit validée, seule la personne qui exploite la base de données a le droit de voir ce qui a été fait. Les autres ne peuvent le voir qu'une fois la validation finale terminée.

À propos des déclarations d'autorisation

Commande d'autorisation de base de données :

GRANT<permission> sur le nom de la table (ou le nom de la colonne) à l'utilisateur

Option de réponse correcte B : insérer, sélectionner : nom de la table d'autorisation : utilisateur utilisateur : nkw

Points de connaissances supplémentaires – autorisations de recyclage

REVOKE <permission> sur le nom de la table (ou le nom de la colonne) DE l'utilisateur

Expliquer l'introduction de la déclaration

Je pense que tout le monde connaît l'instruction d'explication, qui est utilisée comme instruction pour visualiser le plan d'exécution. Expliquer est souvent utilisé dans l'analyse d'optimisation SQL.

Il convient de noter ici : expliquer n'exécute pas réellement l'instruction, mais affiche uniquement le plan d'exécution.

Quelles informations puis-je voir ?

  • Ordre de lecture du tableau
  • Type d'opération de lecture de données
  • Quels index peuvent être utilisés
  • Quels index sont réellement utilisés
  • Références entre les tables
  • Combien de lignes dans chaque table sont interrogées par l'optimiseur

Introduction à la syntaxe de base

  1. EXPLAIN SELECT select具体语句
  2. 如:
  3. EXPLAIN SELECT * FROM userpro

expliquer la fonction de chaque colonne

ListedécrireRemplir
identifiantChaque mot clé SELECT correspond à un identifiant

sélectionner le genre

Type de requête correspondant au mot clé SELECT
tableauNom de la table
partitionsInformations de partition correspondantes
taperMéthode d'accès pour une seule table
clés_possiblesIndex possibles
cléindice réel utilisé
clé_lenLa longueur d'index réelle utilisée
réfLors de l'utilisation de la requête d'équivalence de colonne d'index, les informations sur l'objet qui correspondent à la colonne d'index pour l'équivalence.
LignesNombre estimé d'enregistrements à lire
filtréPourcentage d'enregistrements restants après filtrage par critères de recherche

    

Supplémentaire

informations supplémentaires

               

Introduction détaillée de chaque colonne d'EXPLAIN

1, identifiant

Chaque mot clé SELECT correspond à un identifiant

Plus la valeur de l'identifiant est grande, plus la priorité est élevée et sera exécutée en premier.

Si les identifiants sont identiques, ils peuvent être considérés comme un groupe et exécutés séquentiellement de haut en bas.

Chaque numéro d'identification représente une requête indépendante. Moins il y a de requêtes dans une instruction SQL, mieux c'est.

2, sélectionnez_type

catégorieillustrer
SIMPLERequête de table unique, pas de sous-requête ni de requête UNION.
PRIMAIREInstruction SELECT la plus externe de la requête.
SOUS-REQUETEUne sous-requête est utilisée dans la clause WHERE.
DÉRIVÉPour les sous-requêtes contenues dans la clause FROM, MySQL la marquera comme DERIVED (dérivée) et générera une table temporaire pour son jeu de résultats à utiliser par la requête externe.
SYNDICATLa deuxième instruction de requête et les suivantes dans une requête UNION.
RÉSULTAT SYNDICALL’ensemble de résultats d’une requête UNION.
SOUS-REQUETE DEPENDANTELe résultat de la sous-requête dépend de la valeur de la requête externe et la sous-requête est exécutée une fois pour chaque ligne de la requête externe.
UNION DÉPENDANTELa deuxième instruction de requête et les suivantes d'une requête UNION, ainsi que les résultats dépendent de la valeur de la requête externe.
SOUS-REQUETE NON MISE EN CACHETLa sous-requête ne peut pas être mise en cache et sera exécutée à chaque fois qu'elle sera référencée.

3. La colonne du tableau représente le nom de la table (parfois pas le vrai nom de la table, il peut s'agir d'une abréviation).

4. partitions (facultatif)

5. tapez ☆

Les types courants sont les suivants

taperillustrer
systèmeIl n'y a qu'une seule ligne dans le tableau, généralement SELECT ... FROM DUAL Optimisation des requêtes.
constanteLa requête est trouvée une seule fois dans l'index, avec une seule ligne de résultats (table constante).
eq_refUtilisez un index unique ou une clé primaire pour rechercher une ligne d'une autre table.
réfUtilisez un index non unique pour rechercher une ou plusieurs lignes d'une autre table.
gammeRenvoie une plage de lignes à l'aide d'un index.
indiceAnalyse complètement l'index pour trouver des lignes plutôt que d'analyser la table entière.
tousUne analyse complète du tableau vérifie chaque ligne du tableau.

En général, essayez d'éviter tout

6, clé et clés_possibles

  1. clé

    • key Le champ affiche l'index réel utilisé par la requête.Si la valeur de ce champ estNULL , indiquant qu'aucun index n'est utilisé. Si ce champ a une valeur, cela signifie que MySQL a utilisé l'index spécifié pour exécuter la requête.
  2. clés_possibles

    • possible_keys Field affiche la liste des index que MySQL peut utiliser. Ces index sont des index qui peuvent être pris en compte dans les requêtes, mais qui ne peuvent pas être réellement utilisés. généralement,possible_keys Les index répertoriés dans sont déterminés en fonction des conditions de requête et de la structure de la table.
  • si key Un champ a un nom d'index, etpossible_keys Plusieurs noms d'index sont répertoriés dans , indiquant que MySQL a sélectionnékey L'index sur lequel le champ est répertorié est utilisé pour effectuer la requête, tandis que les autres index sont répertoriés surpossible_keys Medium a déclaré que cela pourrait également être envisagé, mais finalement non utilisé.

  • si key Les champs sontNULL,et possible_keys Plusieurs noms d'index sont répertoriés dans , indiquant que MySQL n'utilise aucun index lors de l'exécution de la requête, ce qui peut entraîner une analyse complète de la table ou d'autres méthodes d'accès non optimisées pour l'index.

7, clé_len

key_len Est un champ décrivant la longueur de la clé d'index. Il indique l'utilisation de l'index et la longueur de la clé d'index lorsque MySQL utilise un index spécifique pour exécuter des requêtes.

  1. Index à une seule colonne

    • Si un index de colonne unique est utilisé et que le type de colonne est de longueur fixe (par ex. INT),mais key_len La valeur est la longueur de la colonne.
    • Si des champs de longueur variable sont utilisés (par ex. VARCHAR),mais key_len La valeur de est la longueur maximale du champ.
  2. index composé

    • Pour les index composites (c'est-à-dire les index contenant plusieurs colonnes),key_len Représente la longueur totale de toutes les colonnes de l'index.
  3. indice combiné

    • Si un index combiné sur plusieurs colonnes est utilisé dans la requête,key_len est la longueur totale de toutes les colonnes de l'index combiné.
  4. préfixe d'index

    • Dans certains cas, MySQL peut utiliser seulement une partie de l'index. Par exemple, vous pouvez utiliser le préfixe de l'index dans le cadre de l'index pour exécuter une requête. dans ce cas,key_len La longueur réelle de la partie index utilisée sera affichée.

8, réf.

ref Il s'agit d'un champ qui décrit les conditions de connexion entre les tables ou utilise un index non unique pour effectuer la recherche. Il indique les conditions de jointure ou les index que MySQL utilise pour accéder à la table lors de l'exécution d'une requête.

9 rangées

rows Est une estimation du nombre de lignes consultées ou examinées lors de l'exécution d'une requête.

  • pour simple SELECT Renseigner,rows Représente le nombre estimé de lignes à renvoyer.
  • Pour les requêtes de jointure (JOIN) ou sous-requête,rows Peut représenter le nombre de lignes consultées lors de l'opération de jointure.
  • Pour l'analyse de table (analyse de table complète ou analyse d'index),rows Peut représenter le nombre de lignes analysées.

10, filtré

Représente le pourcentage de lignes filtrées en fonction des conditions WHERE et des conditions d'index. filtré reflète l'effet d'optimisation des requêtes estimé par l'optimiseur.

quand filtered Lorsqu'il est proche de 100%, cela signifie que les conditions de requête ont filtré efficacement la plupart des lignes ne remplissant pas les conditions, ce qui est généralement un bon indicateur d'optimisation.

Au contraire, si filtered Une valeur faible peut indiquer que les conditions de requête ne sont pas assez précises ou que l'optimiseur n'utilise pas efficacement l'index pour filtrer les données.

11. Supplémentaire

Champs d'informations supplémentaires

En voici quelques-uns courants Extra Champs et leurs significations :

  1. Utilisation de l'index

    • Indique que la requête utilise un index de couverture, c'est-à-dire que les résultats de la requête peuvent être renvoyés entièrement via l'index sans accéder aux lignes de données réelles de la table.
  2. Utilisation où

    • Indique que le serveur MySQL effectuera un filtrage conditionnel une fois que le moteur de stockage aura récupéré les lignes, plutôt que de le compléter dans l'index.
  3. Utilisation temporaire

    • Indique que MySQL a créé une table temporaire en mémoire pour traiter la requête. Couramment utilisé dans les opérations de tri ou les requêtes contenant des fonctions d'agrégation.
  4. Utilisation de filesort

    • Indique que MySQL a effectué un tri des fichiers pour traiter la requête. Cela se produit généralement lorsque le tri ne peut pas être effectué à l'aide d'un index.
  5. Plage vérifiée pour chaque enregistrement (carte d'index : ...)

    • Indique que MySQL utilise l'index pour vérifier si chaque enregistrement se trouve dans la plage spécifiée.Cela se produit généralement lorsquerange Dans le type de requête.
  6. Analyse complète sur clé NULL

    • Indique que MySQL a effectué une analyse complète de la table dans un index pour trouver les lignes correspondant aux valeurs NULL.
  7. Distinct

    • Indique que MySQL cessera de rechercher les lignes en double après avoir trouvé la première ligne correspondante.
  8. Utilisation du tampon de jointure (boucle imbriquée en bloc)

    • Indique que MySQL utilise le tampon de connexion pour gérer l'opération de connexion. Cela se produit généralement lorsque le nombre de tables de connexion est important ou que la taille de la table de connexion est grande.
  9. Impossible OÙ

    • Indique que l'optimiseur MySQL a déterminé que les conditions de la clause WHERE ne peuvent pas être satisfaites et qu'aucune ligne ne sera donc analysée.
  10. Aucune table utilisée

    • Indique que la requête n'implique aucune table, par exemple SELECT NOW()

expliquer l'affichage de l'exécution réelle

préparation des données

Créer le tableau s1

  1. CREATE TABLE s1 (
  2. id INT AUTO_INCREMENT,
  3. key1 VARCHAR(100),
  4. key2 INT,
  5. key3 VARCHAR(100),
  6. key_part1 VARCHAR(100),
  7. key_part2 VARCHAR(100),
  8. key_part3 VARCHAR(100),
  9. common_field VARCHAR(100),
  10. PRIMARY KEY (id),
  11. INDEX idx_key1 (key1),
  12. UNIQUE INDEX idx_key2 (key2),
  13. INDEX idx_key3 (key3),
  14. INDEX idx_key_part(key_part1, key_part2, key_part3)
  15. ) ENGINE=INNODB CHARSET=utf8;

Créer le tableau s2

  1. CREATE TABLE s2 (
  2. id INT AUTO_INCREMENT,
  3. key1 VARCHAR(100),
  4. key2 INT,
  5. key3 VARCHAR(100),
  6. key_part1 VARCHAR(100),
  7. key_part2 VARCHAR(100),
  8. key_part3 VARCHAR(100),
  9. common_field VARCHAR(100),
  10. PRIMARY KEY (id),
  11. INDEX idx_key1 (key1),
  12. UNIQUE INDEX idx_key2 (key2),
  13. INDEX idx_key3 (key3),
  14. INDEX idx_key_part(key_part1, key_part2, key_part3)
  15. ) ENGINE=INNODB CHARSET=utf8;

Les données sont préparées par vous-même.

Exemple d’exécution et résultats

Requête simple

Requête de table unique

EXPLAIN SELECT * FROM `s1`;

Requête de jointure

EXPLAIN SELECT * FROM `s1` INNER JOIN `s2`;

sous-requête

  1. EXPLAIN SELECT * FROM s1 WHERE key1 IN (SELECT key2 FROM s2 WHERE common_field
  2. = 'a');

affichage spécial

afficher le type_sélectionné
  1. #Union 去重
  2. EXPLAIN SELECT * FROM `s1` UNION SELECT * FROM `s2`;
  3. #Union 全查
  4. EXPLAIN SELECT * FROM `s1` UNION ALL SELECT * FROM `s2`;

La dernière étape est la déduplication, une table temporaire sera donc utilisée. Cependant, UNION ALL est une requête pour tous et aucun message de requête de table temporaire n'apparaîtra.

classe de type

const (trouver l'index une fois, une seule ligne de résultats)

EXPLAIN SELECT * FROM s1 WHERE id = 10002;

eq_ref (trouver une ligne d'une autre table à l'aide d'un index unique ou d'une clé primaire)

EXPLAIN SELECT * FROM s1 INNER JOIN s2 ON s1.id = s2.id;

ref (utilisez un index non unique pour trouver une ou plusieurs lignes d'une autre table)

EXPLAIN SELECT * FROM s1 WHERE key1 = 'a';

range (renvoie une plage de lignes en utilisant l'index)

EXPLAIN SELECT * FROM s1 WHERE key1 IN ('a', 'b', 'c');

index (analyser complètement l'index pour trouver des lignes)

EXPLAIN SELECT key_part2 FROM s1 WHERE key_part3 = 'a';

Autres affichages

temps décimal filtré

EXPLAIN SELECT * FROM s1 WHERE key1 > 'za' AND common_field = 'la'