Обновление одной таблицы 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)