MySQL – оптимизация вложенных запросов вида IN (select

August 20, 2014

Подзапросы вложенные в 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 раз.

Комментарии

comments powered by Disqus