Оновіть одну таблицю MySQL значеннями з іншої


93

Я намагаюся оновити одну таблицю 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допомогою idfrom 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!


2
Чи має ваш стовпець "значення" індекс?
noodl

Привіт локшина; ні, valueнаразі не має індексу.
Суперангель

Відповіді:


210
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


3
Дякую wired00! Це чудово працює. Таблиці досить великі ( originalстановить 100 000+ записів та tobeupdated10 000+), тому я скористався вашими та noodl порадами щодо індексів, і весь запит тепер закінчується за секунду. Я не вірю в різницю !? Велике спасибі за вашу допомогу; Я багато чому навчився!
Суперангель

5
Це чудово чути :) Я тут теж багато чого дізнаюсь. Мені дуже подобається цей сайт, оскільки ви можете піддаватися багатьом різним питанням та ідеям
wired00,

спасибі .. Я спробував стільки речей від stackoverflow .. це нарешті спрацювало
Jaxx0rr

Просто хотів зазначити, що просте ОНОВЛЕННЯ з WHERE було набагато швидшим, ніж синтаксис JOIN. Близько 10 000 рядків.
Alex2php

1
Їх ключовий інгредієнт, звичайно, присвоюється як індекс. взяв мене оновити 300K записів за 4 секунди, на відміну від таймаутів без них.
Amjo

0

Це залежить від того, для чого ці таблиці використовуються, але ви можете розглянути можливість встановити тригер на оригінальній таблиці під час вставки та оновлення. Коли вставка або оновлення завершено, оновіть другу таблицю, базуючись лише на одному елементі з вихідної таблиці. Це буде швидше.


Дякую firegnom; Я ніколи раніше не використовував тригери, але обов’язково прочитаю їх.
Суперангель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.