MySQL: быстрый поиск строк, у которых нет соответствующей строки в другой таблице - PullRequest
4 голосов
/ 06 сентября 2011

У меня есть две таблицы в MySQL, которые связаны между собой.Я хотел бы найти строки в таблице A, которые не имеют соответствующей таблицы строк B. Руководство и другие потоки здесь, в SO, рекомендуют сделать следующее:

SELECT a.id
  FROM a LEFT JOIN b ON a.id = b.a_id
  WHERE b.id IS NULL;

Однако это очень медленно.В моем случае таблица A содержит менее 5000 строк, а таблица B - около 40000, но этот запрос занимает до 8 минут.

Кто-нибудь знает, как добиться этого быстрее?

Большое спасибо, Мэтт

РЕДАКТИРОВАТЬ: проблема была в индексе.После его создания запрос выполняется за 10 микросекунд.

Ответы [ 3 ]

5 голосов
/ 06 сентября 2011
  1. Обложка a_id поле с индексом в b таблица
  2. Заменить WHERE b.id IS NULL на WHERE b.a_id IS NULL
2 голосов
/ 06 сентября 2011
SELECT a.id
FROM a 
WHERE NOT EXISTS (
    SELECT *
    FROM b
    WHERE a.id = b.a_id
)

И, конечно, у вас должен быть индекс на b.a_id

1 голос
/ 06 сентября 2011

Вы могли бы сделать это немного быстрее, проверив, является ли столбец внешний ключ пустым, а не ключ (хотя это не объясняло бы такую ​​медлительность):

SELECT a.id
FROM a
LEFT JOIN b ON a.id = b.a_id
WHERE b.a_id IS NULL;

Если это не поможет, попробуйте это:

create index b_a_id on b(a_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...