- jointure interne : connexion interne (connexion équivalente)
- jointure gauche : jointure gauche
- jointure à droite : jointure à droite
- jointure croisée : connexion croisée
ex: Supposons qu'il y ait deux tables comme suit
jointure interne 和 jointure croisée
Les instructions suivantes ont la même sortie
select
user.name,
user.age,
depart.department
from
user
inner join
depart
on
user.name = depart.name
select
user.name,
user.age,
depart.department
from
user
cross join
depart
on
user.name = depart.name
- Les résultats de sortie sont les mêmes. L'utilisation de la jointure croisée et de la jointure interne est la même, prenez l'intersection
- Le résultat est le même si intérieur/croix est omis
- Si la condition n'est pas ajoutée, le résultat est deux "ensembles cartésiens" marqués, comme suit
joint gauche
la jointure gauche obtient tous les enregistrements de la table de gauche, s'il n'y a pas d'enregistrement correspondant dans la table de droite, il sera remplacé par null
- Les liens de table doivent être établis à l'aide du mot-clé on
jointure à droite
la jointure droite obtient tous les enregistrements de la table de droite, s'il n'y a pas d'enregistrement correspondant dans la table de gauche, il sera remplacé par null
- Les jointures de table doivent être établies à l'aide du mot-clé on
Comment créer un index pour l'instruction de jointure
Comprendre d'abord le concept de "table d'entraînement"
Prenez le SQL suivant comme exemple
select user.name,user.age,depart.department
from user
left join depart
on user.name = depart.name
在以上SQL中,查询的主表是user,然后根据on条件去depart表中查询。如果存在相同的name,那么进行数据组合,反之用null代替。
Dans cet exemple, la table de pilotage est user, qui est la table qui lance activement la requête, et la table pilotée est depart , qui est la table interrogée en fonction de la condition on.
L'optimiseur MySQL a un processus de sélection pour la table des pilotes, et le mot-clé straight_join
peut être utilisé pour corriger la table des pilotes. comme suit
select user.name,user.age,depart.department
from user
straight_join depart
on user.name = depart.name
straight_join 使用效果和 left join相同,但是其可以帮助固定驱动表。
Si le mot-clé straight_join n'est pas utilisé, la table de pilotage sera sélectionnée en fonction de l'optimiseur MySQL, à savoir :
- Si la condition de connexion est spécifiée, sélectionnez une table avec un petit nombre de lignes qui répond à la condition de requête comme table de pilotage
- Si aucune condition de jointure n'est spécifiée, analysez la table avec un petit nombre de lignes comme table de pilotage
Autrement dit, l'optimiseur MySQL choisit le pilote en fonction de petites tables pilotant de grandes tables
Supposons qu'il y ait 100 enregistrements dans la table A et 10 000 enregistrements dans la table B, avec le SQL suivant
select * from A join B on A.name = B.name
Indexer la jointure en boucle imbriquée
Si un index est créé sur le nom du champ de la table pilotée B
- Lire une ligne de données du tableau A dans R
- À partir de la ligne de données R, extrayez le champ id vers l'arborescence d'index de noms de la table B pour rechercher et trouver la clé primaire correspondante
- Revenez ensuite à la table en fonction de la clé primaire, supprimez toutes les lignes qui remplissent les conditions de la table B, puis formez une ligne avec la ligne R dans le cadre du jeu de résultats.
- Ce type d'index qui utilise la table pilotée part - Index Nested-Loop Join (NLJ en abrégé)
- Complexité temporelle 100 + 100 = 200 lignes
Jointure en boucle imbriquée simple
S'il n'y a pas d'index sur le nom de champ de la table pilotée B
, une fois le SQL optimisé par l'optimiseur MySQL, le nombre de lignes de données dans la table pilotée A est petit et elle est utilisée comme table de pilotage. Alors son ordre de requête est
- Lisez d'abord toutes les données de la table A, interrogez les données de la table des pilotes et placez-les dans le tampon de jointure
- La condition pour mettre les données dans le tampon de jointure : type = ALL/INDEX, et l'efficacité de la requête est plus élevée dans d'autres cas, et il n'est pas nécessaire de mettre les données dans le tampon de jointure
- Obtenez ensuite l'élément de données de nom à partir des données de la table A lues, puis analysez la table b pour obtenir l'élément correspondant - SNL en abrégé
- Le résultat de sortie final - sa complexité temporelle est de 10 ∗ 10000 = 1 0 6 10*10000=10^6dix∗10000=1 06
Bloquer la jointure en boucle imbriquée
BNL
- Lire les données dans la table A et les mettre dans le tampon de jointure
- Analysez la table B, extrayez chaque ligne de données de la table B, comparez-la avec les données du tampon de jointure et renvoyez-la en tant que jeu de résultats si elle répond à la condition on.
- Faites cela en mémoire, relativement plus rapide que SNL
- Si les données interrogées à un moment donné sont plus grandes que
join_buffer_size
cela, elles seront jointes en blocs