Подзапрос работает быстрее, чем присоединиться? - PullRequest
0 голосов
/ 20 октября 2011

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

Подзапрос

SELECT DISTINCT `Wear it With - Outfits 1` 
  FROM `product list` 
 WHERE `Wear it With - Outfits 1` NOT IN (SELECT `sku` 
                                            FROM `product list`)

... возвращает результат в 2,7287сек

Я пытался заменить подзапрос левым соединением

   SELECT DISTINCT table1.`Wear it With - Outfits 1`
     FROM `product list` as table1 
LEFT JOIN `product list` as table2 ON table1.`Wear it With - Outfits 1`=table2.sku
     WHERE table2.sku IS NULL 
       AND table1.`Wear it With - Outfits 1` IS NOT NULL

... который возвращает результат в 5,7651 сек

Обычно присоединения возвращают результаты намного быстрее. Так что я считаю, что сделал что-то смешное в своем запросе? Но не могу найти причину, почему мой подзапрос работает быстрее, чем

Ответы [ 2 ]

4 голосов
/ 20 октября 2011

Утверждение «Обычно присоединения возвращают результаты гораздо быстрее».глупо, особенно без ссылки на какую-либо конкретную систему баз данных.

Многие факторы влияют на производительность конкретного запроса.Вы можете использовать инструмент EXPLAIN в любом продукте базы данных, который вы используете, чтобы точно определить, почему подзапрос предпочтителен в этом случае (подсказка: скорее всего, это связано с использованием ключевого слова DISTINCT).

0 голосов
/ 20 октября 2011

Основная причина в том, что ваш левый оператор соединения не оптимизирован.Условие WHERE WHERE table2.sku NULL и table1. Wear it With - Outfits 1 NOT NULL может тратить много времени, особенно в этом случае.Вы должны оптимизировать table2, прежде чем покинуть присоединиться.PS: количество записей в таблице 2 должно достигнуть значительного количества.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...