Explication détaillée de la croix, de l'intérieur, de la gauche et de la droite de MySQL

  • 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
image.png

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

image.png

  • 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

image.png

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_joinpeut ê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^6dix10000=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_sizecela, elles seront jointes en blocs

Je suppose que tu aimes

Origine blog.csdn.net/GoNewWay/article/details/130749272
conseillé
Classement