Se você acha que a implementação de LEFT JOIN é INNER JOIN + mais trabalho, então esse resultado é confuso. E se a implementação do INNER JOIN for (LEFT JOIN + filtragem)? Ah, ficou claro agora.
Nos planos de consulta, a única diferença é esta:users... extra:using where . Isso significa filtrar. Há uma etapa de filtragem extra na consulta com a junção interna.
Este é um tipo diferente de filtragem do que é normalmente usado em uma cláusula where. É simples criar um índice em A para dar suporte a essa ação de filtragem.
SELECT *
FROM A
WHERE A.ID = 3
Considere esta consulta:
SELECT *
FROM A
LEFT JOIN B
ON A.ID = B.ID
WHERE B.ID is not null
Essa consulta é equivalente à junção interna. Não há índice em B que ajude nessa ação de filtragem. A razão é que a cláusula where está declarando uma condição no resultado da junção, em vez de uma condição em B.