Cet article est partagé par la communauté Huawei Cloud « Comment MySQL gère-t-il le tri⭐️Comment optimiser les requêtes qui doivent être triées ? » ", auteur : La cuisine privée back-end de Caicai.
Préface
Ces deux mots-clés sont souvent utilisés dans les requêtes MySQL. order by
group by
Ce qu'ils ont en commun, c'est qu'ils trient tous les champs. Alors, comment le tri dans l'instruction de requête est-il implémenté ?
Il existe deux situations de traitement dans lesquelles l'instruction de requête utilisée doit être triée :
- Les enregistrements actuels sont intrinsèquement ordonnés et n'ont pas besoin d'être triés.
- L'enregistrement actuel ne maintient pas l'ordre et doit être trié
Utiliser des index pour garantir la commande
Pour le premier cas, l'ordre des colonnes d'index dans l'index secondaire est souvent utilisé pour garantir l'ordre de l'ensemble de résultats, de sorte qu'aucun tri n'est requis.
Pour la table a, créez un index secondaire pour a2, puis a2 sera ordonné sur l'index secondaire.
CRÉER UNE TABLE `a` ( `a1` int(11) NON NULL AUTO_INCREMENT, `a2` varchar(255) JEU DE CARACTÈRES utf8mb4 NULL PAR DÉFAUT, `a3` varchar(255) NULL PAR DÉFAUT, CLÉ PRIMAIRE (`a1`), CLÉ `idx_a2` (`a2`) ) MOTEUR=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8;
select * from a order by a.a2 limit 10
Lorsque l'optimiseur choisit d'utiliser l'index a2, les enregistrements de la colonne a2 sont eux-mêmes classés, il n'est donc pas nécessaire d'utiliser d'autres frais généraux pour le tri.
Bien entendu, l'optimiseur ne peut pas utiliser l'index a2 (lorsque l'optimiseur pense qu'utiliser a2 pour renvoyer la table coûte trop cher, il utilisera une analyse complète de la table)
Lorsque a2 est hors service sur l'index utilisé par l'optimiseur, les résultats seront triés par d'autres moyens.
tri de fichiers
Lorsque les informations supplémentaires du plan d'exécution apparaissent , le sort_buffer sera utilisé pour trier les résultats. Using filesort
sort_buffer est un morceau de mémoire utilisé pour le tri. sort_buffer peut stocker tous les champs requis pour la requête, ou il peut stocker uniquement les champs et les clés primaires qui doivent être triés.
show variables like 'max_length_for_sort_data'
Lorsque la longueur des champs requis par la requête est inférieure à 1 , tous les champs requis par la requête seront placés dans sort_buffer, puis les colonnes qui doivent être triées seront triées et enfin les résultats seront renvoyés. max_length_for_sort_data
Lorsque la longueur du champ requis pour la requête est supérieure à la longueur du champ , seuls les champs et les valeurs de clé primaire qui doivent être triés seront placés dans sort_buffer, puis l'index clusterisé sera interrogé pour obtenir le colonnes qui doivent être interrogées après le tri (équivalent à un retour supplémentaire à la table) max_length_for_sort_data
Lors du tri dans sort_buffer, s'il y a suffisamment de mémoire, le tri se fera dans la mémoire. Si la mémoire n'est pas suffisante, le fichier temporaire sur le disque sera utilisé pour assister le tri.
Activez-le pour voir si les fichiers temporaires sont utilisés pour faciliter le tri. optimizer_trace
#Activer le suivi de l'optimiseur SET optimiseur_trace='enabled=on'; #sqlstatement sélectionnez * dans la commande des étudiants en fonction de la limite de nom_étudiant de 10 000 ; #Voir les informations suivies par l'optimiseur SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G;
L'algorithme utilisé pour le tri est l'algorithme de fusion. Il est d'abord divisé en plusieurs petits fichiers, triés puis fusionnés.
où number_of_tmp_files
est le nombre de fichiers temporaires utilisés et sort_buffer_size
est la taille de sort_buffer
Par conséquent, lorsque vous utilisez order by, group by et d’autres mots-clés qui doivent être triés, il est préférable d’établir un index approprié.
Si la quantité de données est petite, elles peuvent être triées dans le tampon de tri. Si la quantité de données est trop importante, elles doivent interagir avec le disque.
Résumer
Lorsque l'instruction de requête doit être triée, elle sera divisée en deux situations : pas de tri et besoin de trier.
Lorsque l'index utilisé est en ordre, il n'y a pas besoin de trier, et l'ordre est assuré grâce à l'index.
Lorsque l'index utilisé est dans le désordre, sort_buffer sera utilisé pour le tri. Lorsque la longueur du champ de requête ne dépasse pas la limite, chaque enregistrement de sort_buffer stockera la colonne qui doit être interrogée.
Si la limite est dépassée, sort_buffer stockera uniquement les colonnes et les valeurs de clé primaire qui doivent être triées. Après le tri, les valeurs de clé primaire sont utilisées pour renvoyer la table afin d'obtenir les colonnes qui doivent être interrogées.
Lorsque la quantité de données est trop importante pour être triée en mémoire, des pages de disque seront utilisées pour faciliter le tri, et un algorithme de fusion sera utilisé pour disperser les données triées sur plusieurs pages, puis les fusionner.
Vous pouvez analyser le contenu via l'optimiseur de trace optimiseur_trace pour afficher le nombre de pages auxiliaires et d'autres informations.
Créez des index appropriés pour les colonnes qui doivent être triées afin d'éviter d'utiliser le tri assisté par page de disque
Le tampon de tri ou max_length_for_sort_data peut être ajusté lorsque l'indexation ne peut pas être utilisée (avec prudence)
Cliquez pour suivre et découvrir les nouvelles technologies de Huawei Cloud dès que possible~
L'équipe chinoise d'IA de Microsoft a fait ses valises et s'est rendue aux États-Unis, impliquant des centaines de personnes. Combien de revenus un projet open source inconnu peut-il rapporter ? Huawei a officiellement annoncé que la position de la station miroir open source de l'Université des sciences et technologies de Yu Huazhong a été ajustée. L'accès au réseau externe a été officiellement ouvert. Les fraudeurs ont utilisé TeamViewer pour transférer 3,98 millions ! Que doivent faire les fournisseurs de postes de travail à distance ? La première bibliothèque de visualisation frontale et fondateur du célèbre projet open source de Baidu, ECharts - un ancien employé d'une société open source bien connue qui "est allée à la mer" a annoncé la nouvelle : après avoir été interpellé par ses subordonnés, le technicien Le leader est devenu furieux et grossier et a licencié l'employée enceinte. OpenAI a envisagé d'autoriser l'IA à générer du contenu pornographique. Microsoft a déclaré à la Fondation Rust qu'elle avait fait un don de 1 million de dollars américains. Veuillez me dire quel est le rôle de time.sleep(6) ici. ?