2016-02-16 2 views
2

В последнее время результат операции запроса действительно привлекает мое внимание. Вот оно: Мой первый запрос:Почему mysql «где не существует» намного эффективнее, чем «не в»? Каков механизм «где не существует»?

select * from tableA as a 
where a.keyword NOT IN 
(
select keyword from tableB 
union 
select keyword from tableC 
union 
select keyword from tableD 
) 

мой второй запрос:

select * from tableA as a 
where NOT EXISTS 
(select NULL from 
    (
    select keyword from tableB 
    union 
    select keyword from tableC 
    union 
    select keyword from tableD 
) as t 
where a.keyword=t.keyword 
) 

Очевидно, что эти два запрос эквивалентен. Однако первый из них займет около 10 секунд, а второй - только около 1 секунды. Я действительно хотел бы знать, какой механизм ведет к такой значительной разнице в производительности.

ответ

0

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

Так что первое, вероятно, взять все от tableB, tableC, tableD, строит хэш от keyword, а затем выполняет внешний запрос и проверяет, существует ли keyword в подзапросе.

Второй, возможно, займет каждую строку из tableA, а затем будет проверять, если конкретная keyword существует в одной из таблиц tableB, tableC, tableD.

Он может, однако, изменяться при обновлении с одной версии на другую, а оптимизатор становится умнее или значительно меняет количество строк в одной из таблиц и т. Д.