2013-07-31 2 views
0

У меня есть две таблицы, мы будем называть их email_bounces и master_email_list.SQL-запрос с вложенным запросом в другой таблице в нем

master_email_list составляет ~ 3,5 м записей.

email_bounces ~ 100 000 записей.

Я пытаюсь выполнить запрос, в котором я обновляю bounce = 1 в файле master_email_list, если адрес электронной почты находится в email_bounces.

Вот что у меня есть.

update 'master_email_list' set bounce=1 where email in (select email FROM 'email_bounces') 

Кроме того, что, кажется, не работает, он запрашивает, а затем вешает на неопределенное время (я оставил ее работать на ночь, после того, как около 4 часов работы до).

Справка приветствуется.

+0

У вас есть какой-либо указатель на 'master_email_list.email'? –

+0

У вас есть индекс по электронной почте в master_email_list, а также в таблице bounces? Кроме того, попробуйте установить «master_email_list» set bounce = 1, где EXISTS (выберите 1 FROM 'email_bounces' B где M.email = B.email) ... но вам нужны эти индексы на месте сначала. –

+0

Для работы в MySQL не используйте подзапрос в таком предикате. Вместо этого используйте операцию JOIN. – spencer7593

ответ

0

Использование

update master_email_list l 
inner join email_bounces b on b.email = l.email 
set bounce = 1 

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

ALTER TABLE master_email_list DISABLE KEYS; 

А потом

ALTER TABLE master_email_list ENABLE KEYS; 
0

С помощью таблицы псевдонимов имена вы должны установить его.

В этом я использую внутреннее соединение

update master_email_list mel 
    inner join email_bounces eb 
    on mel.email = eb.email 
    set mel.bounce = 1 
0

Если простой запрос занимает несколько часов, я могу видеть только две возможные причины;

  • У вас отсутствует индекс с master_email_list.email в качестве первого столбца.

    CREATE INDEX ix_email ON master_email_list (электронная почта);

... должно ускорить значительно.

  • У вас есть активная транзакция на столе, которая содержит блокировку. Убедитесь, что у вас нет незавершенных транзакций в ожидании, и если вы не можете их найти, отметьте this answer, как их искать.
Смежные вопросы