MySQL объединяет две очень большие таблицы, когда три столбца равны - PullRequest
1 голос
/ 15 ноября 2011

У меня есть две очень большие таблицы, Таблица1 и Таблица2.Они выглядят так:

Таблица1 (записи 800k): Имя, Дата рождения, Номер заказа, col4, col5, col6.

Таблица2 (записи 200k): Имя, Дата рождения, Номер заказа, col4, col5, col6.

Как выбрать из таблицы 1 все записи, которые не имеют подходящей комбинации Name, BirthDate, OrderNumber в таблице 2?Остальные столбцы не имеют значения.

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

Select Table1.Name, Table1.BirthDate, Table1.OrderNumber from Table1
left join Table2 ON 
Table1.Name=Table2.Name AND
Table1.BirthDate=Table2.BirthDate AND
Table1.OrderNumber=Table2.OrderNumber AND 
WHERE Table2.Name IS NULL;

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

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

Не для того, чтобы осмыслить этот вопрос, но я подозреваю, что ваша индексация должна быть обновлена.Чтобы этот запрос работал быстро, я считаю, что вам нужен один индекс для каждой из двух таблиц, где этот индекс находится на (Name, BirthDate, OrderNumber).Это очень отличается от трех независимых индексов в этих столбцах.

Вы также можете сделать это, установив соответствующий первичный ключ, то есть PRIMARY KEY (Name, BirthDate, OrderNumber).

Если мое предположение неверно, то онобыло бы полезно увидеть результаты SHOW CREATE TABLE в каждой из таблиц.

2 голосов
/ 15 ноября 2011

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

SELECT t1.Name, t1.BirthDate, t1.OrderNumber
    FROM Table1 t1
    WHERE NOT EXISTS(SELECT NULL
                         FROM Table2 t2
                         WHERE t2.Name = t1.Name
                             AND t2.BirthDate = t1.BirthDate
                             AND t2.OrderNumber = t1.OrderNumber)
...