Próbuję zaktualizować jedną tabelę MySQL na podstawie informacji z innej.
Mój original
stół wygląda następująco:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friend
A tobeupdated
tabela wygląda tak:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | | old
4 | | friend
5 | | fortune
Chcę zaktualizować id
w tobeupdated
z id
ze original
na podstawie value
(ciągi przechowywane w VARCHAR(32)
polu).
Mam nadzieję, że zaktualizowana tabela będzie wyglądać następująco:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | 4 | old
4 | 5 | friend
5 | 2 | fortune
Mam zapytanie, które działa, ale jest bardzo wolne:
UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value
To maksymalizuje mój procesor i ostatecznie prowadzi do przekroczenia limitu czasu z tylko ułamkiem wykonanych aktualizacji (jest kilka tysięcy wartości do dopasowania). Wiem, że dopasowywanie według value
będzie wolne, ale to jedyne dane, które muszę dopasować.
Czy istnieje lepszy sposób aktualizowania takich wartości? Mógłbym utworzyć trzecią tabelę dla połączonych wyników, gdyby to było szybsze?
Próbowałem MySQL - Jak mogę zaktualizować tabelę wartościami z innej tabeli? , ale to nie pomogło. Jakieś pomysły?
Z góry dziękujemy za pomoc nowicjuszowi MySQL!
value
w tej chwili nie ma indeksu.Odpowiedzi:
UPDATE tobeupdated INNER JOIN original ON (tobeupdated.value = original.value) SET tobeupdated.id = original.id
To powinno wystarczyć i naprawdę robi dokładnie to, co twoje. Jednak wolę składnię „JOIN” dla złączeń zamiast wielu warunków „WHERE”, myślę, że jest łatwiejsza do odczytania
Jeśli chodzi o wolne działanie, jak duże są stoły? Powinieneś mieć indeksy na
tobeupdated.value
ioriginal.value
EDYCJA: możemy również uprościć zapytanie
UPDATE tobeupdated INNER JOIN original USING (value) SET tobeupdated.id = original.id
USING
jest skrótem, gdy obie tabele sprzężenia mają identyczną nazwę, nakey
przykładid
. tj. dołączenie equi - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-joinźródło
original
100 000 wpisów itobeupdated
ponad 10 000), więc posłuchałem rady Twojej i firmy Noodl dotyczącej indeksów i teraz całe zapytanie kończy się w niecałą sekundę. Nie mogę uwierzyć w różnicę !? Dziękuję bardzo za Twoją pomoc; Wiele się nauczyłem!Zależy to od przeznaczenia tych tabel, ale możesz rozważyć umieszczenie wyzwalacza na oryginalnej tabeli podczas wstawiania i aktualizowania. Po zakończeniu wstawiania lub aktualizacji zaktualizuj drugą tabelę na podstawie tylko jednego elementu z oryginalnej tabeli. Będzie szybciej.
źródło