Om du tror att implementeringen av LEFT JOIN är INNER JOIN + mer arbete, då är detta resultat förvirrande. Vad händer om implementeringen av INNER JOIN är (LEFT JOIN + filtrering)? Ah, det är klart nu.
I frågeplanerna är den enda skillnaden denna:users... extra:using where . Det betyder filtrering. Det finns ett extra filtreringssteg i frågan med den inre kopplingen.
Detta är en annan typ av filtrering än vad som vanligtvis används i en where-klausul. Det är enkelt att skapa ett index på A för att stödja denna filtreringsåtgärd.
SELECT *
FROM A
WHERE A.ID = 3
Tänk på den här frågan:
SELECT *
FROM A
LEFT JOIN B
ON A.ID = B.ID
WHERE B.ID is not null
Denna fråga motsvarar inre koppling. Det finns inget index på B som hjälper den filtreringsåtgärden. Anledningen är att where-klausulen anger ett villkor för resultatet av sammanfogningen, istället för ett villkor för B.