Ditt antagande är falskt; underfrågan kommer endast att köras en gång. Anledningen till att det är långsammare än en join är att IN
kan inte dra fördel av index; den måste skanna sina argument en gång för varje gång WHERE
klausul utvärderas, det vill säga en gång per rad i tabellA. Du kan optimera frågan, utan att använda variabler eller lagrade procedurer, helt enkelt genom att ersätta IN
med en join, alltså:
SELECT tableA.field1, tableA.field2, [...]
FROM tableA
INNER JOIN tableB ON tableA.id = tableB.id
Om du inte har något emot att få tillbaka alla fält från båda tabellerna, måste du räkna upp de fält du vill ha i SELECT
klausul; tableA.*
, till exempel, kommer att framkalla ett syntaxfel.