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

Подзапросы вложенные в 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 — оптимизация вложенных запросов вида IN (select: 2 комментария

  1. Миха

    В статье сказано:
    «Подзапросы вложенные в IN вида ( SELECT … IN ( SELECT …) ) в mysql работают очень медленно»
    Это относится к любым запросам такого вида? Сколько таблиц нужно включить и какого размера, чтобы реально загрузить сервер? Или все таки можно ими пользоваться? Ведь в таких запросах все очень просто и понятно…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *