Votre hypothèse est fausse; la sous-requête ne sera exécutée qu'une seule fois. La raison pour laquelle c'est plus lent qu'une jointure est que IN
ne peut pas profiter des index ; il doit parcourir ses arguments une fois pour chaque fois que le WHERE
clause est évaluée, c'est-à-dire une fois par ligne dans tableA. Vous pouvez optimiser la requête, sans utiliser de variables ni de procédures stockées, simplement en remplaçant le IN
avec une jointure, donc :
SELECT tableA.field1, tableA.field2, [...]
FROM tableA
INNER JOIN tableB ON tableA.id = tableB.id
À moins que cela ne vous dérange pas de récupérer tous les champs des deux tables, vous devez énumérer les champs que vous voulez dans le SELECT
clause; tableA.*
, par exemple, provoquera une erreur de syntaxe.