Обновление одной таблицы MySQL со значениями из другого
Я пытаюсь обновить одну таблицу MySQL на основе информации из другой.
Таблица My original
выглядит так:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friend
И таблица tobeupdated
выглядит так:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | | old
4 | | friend
5 | | fortune
Я хочу обновить id
в tobeupdated
с помощью id
from original
на основе value
(строки, хранящиеся в поле VARCHAR(32)
).
Обновленная таблица будет выглядеть следующим образом:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | 4 | old
4 | 5 | friend
5 | 2 | fortune
У меня есть запрос, который работает, но он очень медленный:
UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value
Это максимизирует мой процессор и в конечном итоге приводит к таймауту, при этом выполняется лишь небольшая часть произведенных обновлений (имеется несколько тысяч значений). Я знаю, что соответствие value
будет медленным, но это единственные данные, которые мне нужно сопоставить.
Есть ли лучший способ обновить такие значения? Я мог бы создать третью таблицу для объединенных результатов, если бы это было быстрее?
Я попробовал MySQL. Как обновить таблицу со значениями из другой таблицы?, но это действительно не помогло. Любые идеи?
Заранее благодарим за помощь новичку MySQL!
Ответы
Ответ 1
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id
Это должно сделать это, и действительно это делает именно то, что у вас есть. Однако я предпочитаю синтаксис "JOIN" для объединений, а не несколько условий "WHERE", я думаю, что его легче читать
Что касается медленного запуска, насколько велики таблицы? У вас должны быть индексы на tobeupdated.value
и original.value
EDIT:
мы также можем упростить запрос
UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id
USING
является сокращением, когда обе таблицы соединения имеют идентичные имена key
, такие как id
. т.е. equi-join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join
Ответ 2
зависит от использования этих таблиц, но вы можете подумать о включении триггера в исходную таблицу при вставке и обновлении, а когда вставка или обновление выполняется, обновите вторую таблицу на основе только одного элемента из исходной таблицы, это будет быстрее.
Ответ 3
Вы можете попробовать это
UPDATE tobeupdated SET id = (SELECT original.id FROM original WHERE tobeupdated.value = original.value LIMIT 1)