Aktualisieren Sie eine MySQL-Tabelle mit Werten aus einer anderen

93

Ich versuche, eine MySQL-Tabelle basierend auf Informationen einer anderen zu aktualisieren.

Mein originalTisch sieht aus wie:

id | value
------------
1  | hello
2  | fortune
3  | my
4  | old
5  | friend

Und der tobeupdatedTisch sieht aus wie:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        |    | old
4        |    | friend
5        |    | fortune

Ich möchte aktualisieren idin tobeupdatedmit dem idvon originalbasierend auf value(Strings in gespeicherten VARCHAR(32)Feld).

Die aktualisierte Tabelle sieht hoffentlich so aus:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        | 4  | old
4        | 5  | friend
5        | 2  | fortune

Ich habe eine Abfrage, die funktioniert, aber sie ist sehr langsam:

UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value

Dies maximiert meine CPU und führt schließlich zu einem Timeout mit nur einem Bruchteil der durchgeführten Aktualisierungen (es gibt mehrere tausend übereinstimmende Werte). Ich weiß, dass das Matching nach valuelangsam sein wird, aber dies sind die einzigen Daten, die ich zusammenpassen muss.

Gibt es eine bessere Möglichkeit, solche Werte zu aktualisieren? Ich könnte eine dritte Tabelle für die zusammengeführten Ergebnisse erstellen, wenn das schneller wäre?

Ich habe MySQL ausprobiert. Wie kann ich eine Tabelle mit Werten aus einer anderen Tabelle aktualisieren? , aber es hat nicht wirklich geholfen. Irgendwelche Ideen?

Vielen Dank im Voraus, dass Sie einem MySQL-Neuling geholfen haben!

Superangel
quelle
2
Hat Ihre 'Wert'-Spalte einen Index?
Nudel
Hallo Nudel; Nein, valuehat momentan keinen Index.
Superangel

Antworten:

210
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id

Das sollte es tun, und es tut wirklich genau das, was deins ist. Ich bevorzuge jedoch die 'JOIN'-Syntax für Joins anstelle mehrerer' WHERE'-Bedingungen. Ich denke, es ist einfacher zu lesen

Wie groß sind die Tabellen, wenn Sie langsam laufen? Sie sollten Indizes für tobeupdated.valueund habenoriginal.value

EDIT: Wir können auch die Abfrage vereinfachen

UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id

USINGist eine Abkürzung, wenn beide Tabellen eines Joins einen identischen Namen haben, keywie z id. dh ein Equi-Join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join

wired00
quelle
3
Danke wired00! Das funktioniert perfekt. Die Tabellen sind ziemlich groß (mehr originalals 100.000 Einträge und tobeupdatedmehr als 10.000 Einträge ), daher habe ich Ihren und Noodls Rat bezüglich der Indizes befolgt und die gesamte Abfrage endet jetzt in weniger als einer Sekunde. Ich kann den Unterschied nicht glauben!? Vielen Dank für deine Hilfe; Ich habe viel gelernt!
Superangel
5
Das ist toll zu hören :) Ich lerne auch hier viel. Ich mag diese Seite wirklich, da Sie vielen verschiedenen Themen und Ideen ausgesetzt sein können
wired00
Danke. Ich habe so viele Dinge aus dem Stackoverflow ausprobiert. Dieser hat endlich funktioniert
Jaxx0rr
Ich wollte nur erwähnen, dass ein einfaches UPDATE mit WHERE viel schneller war als die JOIN-Syntax. Über 10.000 Reihen.
Alex2php
1
Der Hauptbestandteil ist natürlich die Zuweisung als Index. Ich habe 300.000 Datensätze in 4 Sekunden aktualisiert, im Gegensatz zu Zeitüberschreitungen ohne diese.
Amjo
0

Es hängt davon ab, wie diese Tabellen verwendet werden. Sie können jedoch in Betracht ziehen, beim Einfügen und Aktualisieren den Auslöser für die ursprüngliche Tabelle zu setzen. Wenn das Einfügen oder Aktualisieren abgeschlossen ist, aktualisieren Sie die zweite Tabelle basierend auf nur einem Element aus der ursprünglichen Tabelle. Es wird schneller gehen.

firegnom
quelle
Danke firegnom; Ich habe noch nie Trigger verwendet, aber ich werde sie auf jeden Fall nachlesen.
Superangel