2015-05-16 4 views
0

У меня есть 2 таблицы, TABLE1 и TABLE2 каждый с несколькими миллионами строк. Столбец в TABLE1 обновляется на основе идентификаторов с определенной функцией в TABLE2.Производительность UPDATE и двух таблиц в MySQL

Может кто-нибудь объяснить мне, почему второе решение ниже занимает 30 секунд, в то время как первое решение даже не заканчивается через 5 часов? Я думал, что код с необходимостью создания новой таблицы и ее удаления после завершения обновления не является хорошим стилем кодирования. Но в этом случае он намного быстрее. Есть ли рекомендация?

1.) принимает навсегда:
UPDATE TABLE1 SET TABLE1.MYCOLUMN = 1 WHERE TABLE1.ID IN (SELECT distinct(ID) FROM TABLE2 where ....);

2.) займет 30 секунд:

CREATE TABLE TABLE3 AS (SELECT distinct(ID) FROM TABLE2 where ....); ALTER TABLE TABLE3 ADD primary key(ID); UPDATE TABLE1 SET TABLE1.MYCOLUMN = 1 WHERE TABLE1.ID IN (SELECT * FROM TABLE3);

+0

Обозначены ли ваши колонки? –

+0

Сколько различных идентификаторов по сравнению с фактическими идентификаторами, возвращаемыми из подзапроса? – Bohemian

ответ

0

В общем, WHERE IN (some query returning lots of rows) выполняет плохо. Хотя оптимизатор должен иметь возможность преобразовать его в соединение, часто это не так, что означает, что весь набор результатов должен храниться в памяти и не индексироваться.

Попробуйте использовать несколько синтаксис обновления таблицы в MySQL:

UPDATE TABLE1 
JOIN TABLE2 ON TABLE1.ID = TABLE2.ID 
SET TABLE1.MYCOLUMN = 1 

Убедитесь, что есть индекс по TABLE1.ID и один на TABLE2.ID.

Смежные вопросы