MySQL est connu pour ne pas être très performant avec les sous-requêtes. Ce n'est pas faux, et d'ailleurs c'est encore le cas avec MySQL 5.5. Le contournement consiste en général à réécrire la requête, certaines sous-requêtes pouvant être aisément réécrite en jointure.
C'est le cas de
SELECT a FROM T1 WHERE col IN (SELECT col FROM T2...) qui se transforme en
SELECT distinct a FROM T1 INNER JOIN T2 ON TI.col=T2.col WHERE …