Cet algorithme est relativement simple. R1 est extrait de la table des pilotes pour correspondre à toutes les colonnes de la table S, puis R2, R3, jusqu'à ce que toutes les colonnes soient sélectionnées. les données de la table R sont mises en correspondance, puis les données sont fusionnées. Vous pouvez voir que cet algorithme nécessite des accès RN à la table S. Bien qu'il soit simple, la surcharge est encore trop élevée
(2) Index. Nested-Loop Join, la méthode d'implémentation est la suivante :
Connexion imbriquée d'index Puisqu'il y a des index sur la table non pilotée, lors de la comparaison Au lieu de comparer les enregistrements un par un, les index peuvent être utilisés pour réduire les comparaisons, accélérant ainsi les requêtes. C'est l'une des principales raisons pour lesquelles nous exigeons généralement que les champs associés aient des index lors des requêtes associées.
Lorsque cet algorithme effectue une requête de lien, la table du pilote effectuera une recherche en fonction de l'index du champ associé lorsqu'une valeur correspondante est trouvée sur l'index, elle reviendra à la table pour la requête, c'est-à-dire. seulement lorsque l'index correspond. Ce n'est qu'alors que la table sera renvoyée. Quant à la sélection de la table des pilotes, l'optimiseur MySQL choisira généralement la table des pilotes avec un petit nombre d'enregistrements. Cependant, lorsque le SQL est particulièrement complexe, des sélections incorrectes ne peuvent être exclues.
En mode lien imbriqué index, si la clé associée de la table non pilotée est la clé primaire, les performances seront très élevées. Si ce n'est pas la clé primaire, le nombre de lignes renvoyées sera. très élevée si elle est associée, l'efficacité sera particulièrement faible car plusieurs opérations de retour de table sont nécessaires. Associez d’abord l’index, puis effectuez l’opération de retour de table en fonction de l’ID de clé primaire de l’index secondaire. Dans ce cas, les performances seront relativement médiocres.
(3) Block Nested-Loop Join, implémenté comme suit :
Lorsqu'il y a un index, MySQL essaiera d'utiliser l'index imbriqué -Algorithme de jointure en boucle. Dans certains cas, la colonne Join peut ne pas avoir d'index. Dans ce cas, le choix de MySQL ne sera certainement pas l'algorithme Simple Nested-Loop Join introduit en premier, mais donnera la priorité à l'algorithme Block Nested-Loop Join. .
Par rapport à la jointure simple en boucle imbriquée, la jointure en boucle imbriquée par bloc a un processus de traitement intermédiaire supplémentaire, qui est le tampon de jointure. Utilisez le tampon de jointure pour mettre en mémoire tampon toutes les colonnes liées à la requête JOIN de la table du pilote. JOIN BUFFER, puis Comparez les lots avec des tables non pilotées. Si cela est également implémenté, plusieurs comparaisons peuvent être fusionnées en une seule, réduisant ainsi la fréquence d'accès aux tables non pilotées. Autrement dit, la table S ne doit être accédée qu’une seule fois. De cette façon, la table non pilotée ne sera pas accédée plusieurs fois, et ce n'est que dans ce cas que le tampon de jointure sera accédé.
Dans MySQL, nous pouvons définir la valeur du tampon de jointure via le paramètre join_buffer_size, puis effectuer l'opération. Par défaut join_buffer_size=256K, MySQL mettra en cache toutes les colonnes requises dans le tampon de jointure pendant la recherche, y compris les colonnes sélectionnées, au lieu de simplement mettre en cache les colonnes associées. Dans un SQL avec N associations JOIN, N-1 tampons de jointure seront alloués lors de l'exécution.
L'introduction ci-dessus est complète, jetons un œil aux exemples spécifiques
(1) Tableau complet JOIN
EXPLAIN SELECT * FROM comments gc
JOIN comments_for gcf ON gc.comments_id=gcf.comments_id;
Regardez les informations de sortie :