ОБЪЯСНИТЬ ПЛАН нужно долго

Я пытаюсь понять, почему запрос так долго, чтобы я мог оптимизировать его.

Я попробовал это с EXPLAIN:

EXPLAIN SELECT * FROM (
SELECT p.*, ol. prod_id olpid
FROM products p LEFT JOIN orderlines ol
ON p. prod_id = ol. prod_id ) pol
WHERE pol. olpid IS NULL
ORDER BY category , prod_id;

Когда я запускаю это на своем Workbench, я получаю код ошибки для соединения, потерянного через 10 минут (600 секунд). После того, как я установил Index в Prod_IDзапрос отвечает примерно за секунду (безупречно), до этого почти невозможно было получить ответ. Также EXPLAIN PLAN мог выполнить это за несколько секунд. Тем не менее, я хочу использовать EXPLAIN в запросе перед использованием индекса.

Есть идеи здесь?

1 ответ

Решение

Вам не нужен подзапрос здесь. Используйте этот запрос вместо:

SELECT p.*, ol.prod_id olpid
FROM products p LEFT JOIN orderlines ol
ON p.prod_id = ol.prod_id
WHERE ol.prod_id IS NULL
ORDER BY category, prod_id;

Ваш первоначальный запрос выполняется дольше, потому что вы используете подзапрос. Подзапрос должен быть выполнен полностью, затем может быть применено условие WHERE, и в конце записи упорядочены. Это также причина, почему ваш запрос с EXPLAIN идет медленно.

Другие вопросы по тегам