ordre d'exécution mysql et algorithme d'indexation

Mots-clés utilisés dans la requête SQL : select, distinct, from, join, on, where, group by, having, sum, count, max, avg, order by, limit

1. Ordre d'écriture :

select->distinct->from->join->on->where->group by->ayant->order by->limit

Champs obligatoires : sélectionner, à partir de

Champs optionnels : distinct, join, on, where, group by, having, sum, count, max, avg, order by, limit

2. Séquence d'exécution

from->on->join->where->group by (commencez à utiliser l'alias dans select, l'alias peut être utilisé dans l'instruction suivante) ->sum, count, max, avg->having->select->distinct->order by->limit

L'ordre d'exécution approximatif de mysql est le suivant :

  1. de la scène

  2. où l'étape

  3. groupe par étape

  4. avoir la scène

  5. sélectionner l'étape

  6. commander par étape

  7. étape limite

3. Questions

Question : Pourquoi les alias de champ ne peuvent-ils pas être utilisés dans where, mais peuvent être utilisés dans order by ?

Étant donné que l'ordre d'exécution de select est postérieur, la phase de requête exécutée avant lui ne peut pas être utilisée. L'ordre par étape est derrière la sélection, donc les alias de champ peuvent être utilisés.

Quatrièmement, la signification des mots-clés

  • from : quelle table de données doit récupérer les données (besoin de récupérer cette table de données)
  • join : associe les tables qui doivent être associées à la requête (nécessité d'associer la table de la requête)

Lors de l'exécution d'une requête associée, la base de données sélectionne une table de pilotage, puis utilise les enregistrements de cette table pour s'associer à d'autres tables. Les jointures gauches utilisent généralement la table de gauche comme table de pilotage (les jointures droites sont généralement la table de droite) et les jointures internes utilisent généralement la table avec moins d'ensembles de résultats comme table de pilotage. Dans certains cas, la jointure gauche sera optimisée en tant que jointure interne par l'optimiseur de requête
.

Principe de sélection de la table de pilotage : Partant du principe qu'elle n'a aucun effet sur l'ensemble de résultats final, la table avec le moins d'ensemble de résultats est préférée comme table de pilotage

Remarque : Vous pouvez utiliser expliquer pour trouver la table des pilotes, la première table dans le résultat est la table des pilotes, mais le plan d'exécution peut changer lorsqu'il est réellement exécuté

  • sur : condition d'association

  • : Conditions de filtrage des données dans la table

    • Ordre d'exécution : de bas en haut, de droite à gauche
    • Remarque : Cela s'applique aux enregistrements de la base de données, mais pas aux résultats de l'agrégation. Les conditions permettant de filtrer le nombre maximal d'enregistrements doivent être écrites à la fin de la clause where et les fonctions d'agrégation (sum, count, max, avg) ne peuvent pas être utilisées.
  • group by : comment regrouper les données filtrées ci-dessus

    • Ordre d'exécution : de gauche à droite
    • Remarque : essayez d'utiliser where filter avant group by, évitez d'utiliser after filter
  • moy : valeur moyenne

  • ayant : Conditions de filtrage des données groupées ci-dessus

    • Remarque : filtrez les résultats de l'agrégation, donc c'est très gourmand en ressources, vous pouvez utiliser la fonction d'agrégation

    • Exemple : zones de dépistage avec une population statistique supérieure à 100 W

      sélectionnez la région, la somme (population), la somme (zone) du groupe bbc par région ayant la somme (population)> 1000000, vous ne pouvez pas utiliser où filtrer les zones dépassant 100W, car il n'y a pas un tel enregistrement

  • select : Afficher la colonne ou le résultat de calcul d'une colonne dans le jeu de résultats

  • distinct : dédupliquer les valeurs en double dans le jeu de résultats

  • trier par : dans quel ordre afficher les données renvoyées

    • Ordre d'exécution : de gauche à droite
    • Remarque : très gourmand en ressources
  • limit : intercepter les données de la page cible

5. Algorithme utilisé dans l'association d'index

  • Dans le cas des jointures indexées , il existe deux algorithmes Index Nested-Loop join(index apply loop join) et Batched Key Access join(batch key access join)
  • Dans le cas où l'association d'index n'est pas utiliséeSimple Nested-Loop join , il existe deux algorithmes (simple nested loop join) et Block Nested-Loop join(cached block nested loop join)

Analyse des algorithmes

  • Simple Nested-Loop join(SNLJ, Simple Nested Loop Join) Algorithme : Selon la condition, récupérez un élément de données de la table de pilotage, puis numérisez la table entière vers la table pilotée et placez les enregistrements qualifiés dans le jeu de résultats final. De cette façon, chaque enregistrement de la table pilotée est accompagné d'un balayage complet de la table pilotée
    • Nombre de correspondances : le nombre de lignes dans le tableau externe * le nombre de lignes dans le tableau interne
  • Index Nested-Loop Join(INLJ, Index Nested Loop Join) Algorithme : Index Nested Loop Join est un algorithme de jointure basé sur l'index. L'index est basé sur la table interne. La condition de correspondance de la table externe est directement mise en correspondance avec l'index de la table interne, évitant ainsi la comparaison avec chaque enregistrement de la table interne, de sorte que la requête utilisant l'index réduit le nombre de correspondances avec la table interne.
    • Nombre de correspondances : le nombre de lignes dans la table externe * la hauteur d'index de la table interne
  • Block Nested-Loop Join(BNLJ, cache block nested loop join) algorithme : la jointure de boucle imbriquée par bloc de cache met en cache plusieurs éléments de données à la fois, met en cache les colonnes participant à la requête dans le tampon de jointure, puis fait correspondre les données du tampon de jointure avec les données de la table interne par lots, réduisant ainsi le nombre de boucles internes (les données de la table externe dans le tampon de jointure peuvent être mises en correspondance par lots une fois en traversant la table interne une fois).
    Lorsqu'il n'est pas utilisé Index Nested-Loop Join, utiliser par défautBlock Nested-Loop Join
  • Batched Key Access join(BKAJ) Algorithme : similaire à l'algorithme SNLJ, mais un index est disponible sur la table jointe. Avant que les lignes ne soient soumises à la table jointe, les lignes sont triées en fonction du champ d'index, ce qui réduit les E/S aléatoires. Le tri est la plus grande différence entre les deux, mais que se passe-t-il si la table jointe n'utilise pas d'index ? Ensuite, utilisez BNLJ

6. Qu'est-ce que c'est Join Buffer?

  • Join BufferToutes les colonnes participant à la requête seront mises en cache au lieu des seules colonnes de jointure.

  • join_buffer_sizeVous pouvez ajuster la taille du cache en

  • join_buffer_sizeLa valeur par défaut est 256 Ko, join_buffer_sizela valeur maximale MySQL 5.1.22est avant la version , et la version ultérieure peut s'appliquer pour un espace supérieur au système 4Gd'exploitation 64 bits .4GJoin Buffer

  • L'utilisation de l'algorithme nécessite l'activation de Block Nested-Loop Joinla configuration de la gestion de l'optimiseur , et la valeur par défaut est activée.optimizer_switchblock_nested_loopon

  • Lors du choix d'un algorithme de jointure, il y aura une priorité. En théorie, il sera priorisé pour déterminer si INLJ et BNLJ peuvent être utilisés :
    Index Nested-LoopJoin > Block Nested-Loop Join > Simple Nested-Loop Join

Lien de référence :

  1. Séquence d'exécution SQL

  2. Ordre d'exécution MySQL

Je suppose que tu aimes

Origine blog.csdn.net/qq_44113347/article/details/131372628
conseillé
Classement