2015-08-31 6 views
1

У меня есть 2 таблицы MySQL: список терминов и черный список. У них обоих есть индекс в поле «термин», а в «черном списке» есть еще один индекс в поле «статус».Как избежать полного сканирования таблицы при обновлении с предложением IN в MySQL

Я хочу, чтобы обновить статус терминов в termlist, которые также появляются в черный список со статусом как «A», к «B», я выполняю этот SQL заявление:

update termlist set status = 'B' where term in (select term from blacklist where status = 'A') 

Это вызывает полное сканирование таблицы в списке терминов. Я хочу использовать «update with inner join», но я не могу, так как в предложении select есть предложение where.

Я знаю, что могу создать временную таблицу из этого оператора select, а затем обновить внутреннее соединение с этой временной таблицей, но это довольно утомительно, если я хочу сделать это обновление много раз.

Есть ли одна инструкция по обновлению, которая может выполнять работу без полного сканирования таблицы?

+0

таблица схемы показывает индекс информация не рука наберется пожалуйста, 'показать создать таблицу xxx' для каждого – Drew

+0

, если это даже необходимо ... так пропустить то, что я только что сказал ... Вы хотите использовать обновление с шаблоном объединения таблиц, см. [Здесь] (http://stackoverflow.com/questions/15209414/mysql-update-join) – Drew

ответ

2

Вы можете использовать:

update termlist t inner join blacklist b 
    on t.term=b.term 
    set t.status = 'B' 
    where b.status = 'A' 
+0

Я буду использовать 2 таблицы temp, чтобы попробовать ваше утверждение. Если они ответят правильно, я проверю ваш ответ. –