Ну, во-первых, эти запросы не обязательно возвращают одинаковые результаты:
1. SELECT x FROM table1 WHERE x IN (SELECT x FROM table2 WHERE y = foo)
2. SELECT x FROM table1 JOIN table 2 USING x WHERE table2.y = foo
IN () удаляет дубликаты. Таким образом, если table2 содержит 50 значений x, удовлетворяющих условию y = foo, запрос 2 вернет в 50 раз больше строк, чем запрос 1. Это может быть тем, что вы хотите, или нет. Если x равен УНИКАЛЬНО в обеих таблицах, запросы будут давать одинаковые результаты.
подзапросы (параметры 1 и 2) выполняются для каждой строки внешнего запроса
Это, конечно, неправильно, поскольку подзапросы не являются зависимыми подзапросами . В любом случае, он выполнит подзапрос один раз, и его хешируют или сортируют, чтобы исключить дубликаты (как того требует IN ()), а затем используют полученный список для выполнения IN-объединения. MySQL до тех пор, пока в последних версиях не выполнялся повторный запрос для каждой строки, это уже не так. Поскольку MySQL не выполняет хэш-соединения IN, он все равно может быть намного медленнее, чем JOIN.