Выполнение запроса слишком длительное

В настоящее время в базе данных есть две таблицы. Вызываемая электронная почта и неподписанные обе таблицы имеют столбец с именем "Электронная почта". теперь я хочу сравнить эти две таблицы и везде, где подходит адрес электронной почты, я хочу обновить столбец в таблице электронной почты с именем Email_status_id до 2... запрос, который я использую,

UPDATE Email E
SET E.Email_status_id = 2
WHERE 
 E.Email
 IN (
 SELECT 
 U.Email
 FROM 
 UNSUSCRIBED U);

В настоящее время я использую mysql.

таблица электронной почты имеет 2704569 строк электронной почты и неподписанной таблицы имеет 12102 строки электронной почты

время выполнения запроса берется навсегда....

любое предложение сократить время выполнения запроса...

3 ответа

Прежде всего, нужно создать индекс для Unsubscribed(Email):

create index idx_unsubscribed_email on unsubscribed(email);

Или, что еще лучше, объявите его как primary key, особенно если он является единственным столбцом в таблице.

Затем, MySQL иногда делает плохую работу по реализации in. Существует множество способов записи запроса с использованием индекса. Exists типичный метод:

update email e
 set email_status_id = 2
 where exists (select 1 from unsubscribed u where u.email = e.email);

Версия join должна иметь схожую производительность с индексом.

РЕДАКТИРОВАТЬ:

Индекс по email(email) также может помочь в запросе. По какой-то причине я предположил, что это уже будет ключом в таблице.


Вы выполняете сравнение строк по большому количеству данных в предложении In. Поскольку вам действительно не нужны данные, вы можете сделать это в Exists:

Update Email E
Set E.Email_status_id = 2
Where Exists
(
 Select 1
 From Unsubscribed U
 Where U.Email = E.Email
)

Помимо этого, правильного индексирования на Email столбце как Email и имеющие Unsubscribed таблиц будут до вашей производительности, а также.


IN в отношении целых таблиц обычно медленны. Это связано с тем, что он должен запускать ваш подзапрос по каждой отдельной строке таблицы, чтобы получить ваш фильтр результатов. Попробуйте использовать соединение, например:

Update Unsubscribed U join Email E on E.Email=U.Email
SET E.email_status_id = 2

licensed under cc by-sa 3.0 with attribution.