Si vous pensez que l'implémentation de LEFT JOIN est INNER JOIN + plus de travail, alors ce résultat est déroutant. Et si l'implémentation d'INNER JOIN est (LEFT JOIN + filtrage) ? Ah, c'est clair maintenant.
Dans les plans de requête, la seule différence est la suivante :users... extra :using where . Cela signifie filtrage. Il existe une étape de filtrage supplémentaire dans la requête avec la jointure interne.
Il s'agit d'un type de filtrage différent de celui généralement utilisé dans une clause where. Il est simple de créer un index sur A pour prendre en charge cette action de filtrage.
SELECT *
FROM A
WHERE A.ID = 3
Considérez cette requête :
SELECT *
FROM A
LEFT JOIN B
ON A.ID = B.ID
WHERE B.ID is not null
Cette requête est équivalente à une jointure interne. Il n'y a pas d'index sur B qui aidera cette action de filtrage. La raison en est que la clause where indique une condition sur le résultat de la jointure, au lieu d'une condition sur B.