Я пытаюсь обновить одну таблицу MySQL на основе информации из другой.
Моя 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
от на 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!
value
в данный момент индекса нет.Ответы:
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
. т.е. равное соединение - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-joinисточник
original
100 000+ записей иtobeupdated
10 000+), поэтому я принял ваш совет и noodl по поводу индексов, и теперь весь запрос завершается менее чем за секунду. Не могу поверить в разницу !? Большое спасибо за Вашу помощь; Я многому научился!Это зависит от того, как используются эти таблицы, но вы можете рассмотреть возможность включения триггера в исходную таблицу при вставке и обновлении. Когда вставка или обновление завершены, обновите вторую таблицу на основе только одного элемента из исходной таблицы. Так будет быстрее.
источник