Подзапросы вложенные в IN вида ( SELECT … IN ( SELECT …) ) в mysql работают очень медленно. Хотя по отдельности они обрабатываются довольно шустро.
Дело в том, что Mysql не умеет автоматически их оптимизировать.
Поэтому для их ускорения для начала необходимо проверить наличие ключей по полям участвующим в запросе. И следующим шагом требуется переписать данный запрос с помощью JOIN.
Покажем это на примерах:
Такой запрос:
SELECT * FROM `table1` WHERE id NOT IN (SELECT id FROM `table2`);
переписываем так:
SELECT `table1`.*
FROM `table1` LEFT JOIN `table2` ON `table1`.id=`table2`.id
WHERE `table2`.id IS NULL;
Пример 2:
SELECT `table1`.id
FROM `table1`
WHERE id
IN (
SELECT `table2`.st_id
FROM `table2`
WHERE adist = 31
GROUP BY st_id
)
ORDER BY name
переписываем так
SELECT `table1`.id
FROM `table1`
JOIN `table2` ON `table1`.id = `table2`.st_id
WHERE `table2`.adist =31
GROUP BY `table1`.id
ORDER BY `table1`.id
В моем случае второй запрос стал выполняться быстрее более чем в 10 раз.
Полезные MySQL запросы http://plutov.by/post/mysql_useful_queries
В статье сказано:
«Подзапросы вложенные в IN вида ( SELECT … IN ( SELECT …) ) в mysql работают очень медленно»
Это относится к любым запросам такого вида? Сколько таблиц нужно включить и какого размера, чтобы реально загрузить сервер? Или все таки можно ими пользоваться? Ведь в таких запросах все очень просто и понятно…