2014-12-14 10 views
0

Таблица один имеет:Регистрация и обновить большую таблицу в Mysql

id, new_id, col1, col2 

Таблица два имеет:

id, col1, col2 

Таблица один составляет более миллиона строк и таблица два около 250К.

То, что я хочу сделать в одном запросе:

SET t1.new_id = t2.id 
WHERE t1.col1 = t2.col1 
AND t1.col2 = t2.col2 
AND t1.new_id IS NULL 

То, что я прямо сейчас:

UPDATE t1 
LEFT JOIN t2 
ON t1.new_id IS NULL 
AND t1.col1 = t2.col1 
AND t1.col2 = t2.col2 
SET t1.new_id = t2.id 

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

+0

Вы пробовали его на меньшем образце? – DanMan

ответ

1

Синтаксис вашего запроса в порядке. Кроме этого, фильтр на t1 должен идти в пункте where:

UPDATE t1 LEFT JOIN 
     t2 
     ON t1.col1 = t2.col1 AND t1.col2 = t2.col2 
SET t1.new_id = t2.id 
WHERE t1.new_id IS NULL 

Или используйте inner join:

UPDATE t1 JOIN 
     t2 
     ON t1.new_id IS NULL AND t1.col1 = t2.col1 AND t1.col2 = t2.col2 
SET t1.new_id = t2.id; 

LEFT JOIN сохраняет все строки в первой таблице, независимо от пункта ON. Это означает, что ваша формулировка обновляет все строки в t1, что может вызвать проблемы с производительностью. Либо использование предложения where для фильтров в первой таблице, либо с использованием inner join должно исправить этот аспект проблемы.

Кроме того, индексы помогли бы. Я бы порекомендовал следующее: t2(col1, col2, id), t1(new_id, col1, col2).

+0

Спасибо, я уверен, что это работает, но они оба занимали много времени для меня, но тогда я не имел большого количества памяти (4gb). Я закончил создание индексов и написал скрипт, который перебирает t2 и обновляет t1. Из-за индексов это было довольно быстро. –

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