Подзапрос не в вопросе производительности - PullRequest
5 голосов
/ 26 октября 2010

У меня медленный запрос

select * from table1 where id NOT IN ( select id from table2 )

Будет ли это быстрее, если сделать что-то вроде (не уверен, если это возможно):

select * from table1 where id not in ( select id from table2 where id = table1.id )

Или:

select * from table1 where table1.id NOT EXIST( select id from table2 where table2.id = table1.id )

Или:

select * from table1
left join table2 on table2.id = table1.id
WHERE table2.id is null

Или делать что-то еще?Как разбить его на два запроса ...

Ответы [ 2 ]

8 голосов
/ 26 октября 2010

Вопрос в том, являются ли поля (и) в сравнении обнуляемыми (то есть, может ли значение столбца быть NULL)?

Если они обнуляются ...

..В MySQL NOT IN или NOT EXISTS работают лучше - см. эту ссылку .

Если они НЕ обнуляемы ...

... LEFT JOIN / IS NULL работает лучше - см. эту ссылку .

1 голос
/ 26 октября 2010
select table1.* from table1 
LEFT JOIN table2 ON table1.id = table2.id
WHERE table2.id IS NULL

Цель избавиться от НЕ В

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