Als je denkt dat de implementatie van LEFT JOIN INNER JOIN + meer werk is, dan is dit resultaat verwarrend. Wat als de implementatie van INNER JOIN is (LEFT JOIN + filtering)? Ah, het is nu duidelijk.
In de queryplannen is het enige verschil dit:users... extra:using where . Dit betekent filteren. Er is een extra filterstap in de query met de inner join.
Dit is een ander soort filtering dan doorgaans wordt gebruikt in een waar-clausule. Het is eenvoudig om een index op A te maken om deze filteractie te ondersteunen.
SELECT *
FROM A
WHERE A.ID = 3
Overweeg deze vraag:
SELECT *
FROM A
LEFT JOIN B
ON A.ID = B.ID
WHERE B.ID is not null
Deze query is gelijk aan inner join. Er is geen index op B die die filteractie zal helpen. De reden is dat de where-clausule een voorwaarde op het resultaat van de join vermeldt, in plaats van een voorwaarde op B.