Mysql выбрать, где не в таблице

голоса
50

У меня 2 таблицы (А и В) с теми же самыми первичными ключами. Я хочу, чтобы выбрать все строки, которые находятся в А и не в B. следующих видов работ:

select * from A where not exists (select * from B where A.pk=B.pk);

Однако, кажется, довольно плохо (~ 2 сек на только 100k строк в А и 3-10k меньше в B)

Есть ли лучший способ запустить это? Может быть, как слева присоединиться?

select * from A left join B on A.x=B.y where B.y is null;

По моим данным это, кажется, работать немного быстрее (~ 10%), но как насчет в целом?

Задан 09/12/2008 в 20:52
источник пользователем
На других языках...                            


5 ответов

голоса
50

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

SELECT A.*    
from A left join B on 
    A.x = B.y
    where B.y is null
Ответил 09/12/2008 в 21:09
источник пользователем

голоса
35

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

Ответил 09/12/2008 в 21:47
источник пользователем

голоса
2

Соединения, как правило, быстрее (в MySQL), но вы должны также рассмотреть вашу схему индексации, если вы обнаружите, что он все еще движется медленно. Как правило, любая настройка поля в качестве внешнего ключа (с использованием INNODB) уже есть множество индексов. Если вы используете MyISAM, убедитесь, что все столбцы в операторе ON индексируются, а также рассмотреть добавление любых столбцов в предложении WHERE в конце индекса, чтобы сделать его в индекс покрытия. Это позволяет двигателю иметь доступ ко всем необходимым данным индекса, устраняя необходимость сделать второй тур-поездку обратно к исходным данным. Имейте в виду, что это будет влиять на скорость вставки / обновления / удаления, но может значительно увеличить скорость запроса.

Ответил 28/09/2010 в 22:58
источник пользователем

голоса
2

Я также использую левый присоединяется с «где table2.id является нулевым» критериями типа.

Конечно, кажется более эффективным, чем вариант вложенного запроса.

Ответил 27/05/2009 в 15:52
источник пользователем

голоса
-2

Это помогло мне много. Joinsвсегда быстрее , чем подзапросы , чтобы дать результаты:

SELECT tbl1.id FROM tbl1 t1
LEFT OUTER JOIN tbl2 t2 ON t1.id = t2.id 
WHERE t1.id>=100 AND t2.id IS NULL ;
Ответил 14/12/2015 в 10:25
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more