Ihre Annahme ist falsch; Die Unterabfrage wird nur einmal ausgeführt. Der Grund, warum es langsamer als ein Join ist, liegt darin, dass IN
kann Indexe nicht nutzen; es muss seine Argumente einmal für jedes Mal scannen, wenn WHERE
-Klausel wird ausgewertet, d. h. einmal pro Zeile in TabelleA. Sie können die Abfrage optimieren, ohne Variablen oder gespeicherte Prozeduren zu verwenden, indem Sie einfach IN
ersetzen mit einem Join, also:
SELECT tableA.field1, tableA.field2, [...]
FROM tableA
INNER JOIN tableB ON tableA.id = tableB.id
Sofern es Ihnen nichts ausmacht, jedes Feld aus beiden Tabellen zurückzubekommen, müssen Sie die gewünschten Felder im SELECT
aufzählen Klausel; tableA.*
, wird beispielsweise einen Syntaxfehler hervorrufen.