Ich versuche, eine MySQL-Tabelle basierend auf Informationen einer anderen zu aktualisieren.
Mein original
Tisch sieht aus wie:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friend
Und der tobeupdated
Tisch sieht aus wie:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | | old
4 | | friend
5 | | fortune
Ich möchte aktualisieren id
in tobeupdated
mit dem id
von original
basierend 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 value
langsam 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!
value
hat momentan keinen Index.Antworten:
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.value
und habenoriginal.value
EDIT: Wir können auch die Abfrage vereinfachen
USING
ist eine Abkürzung, wenn beide Tabellen eines Joins einen identischen Namen haben,key
wie zid
. dh ein Equi-Join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-joinquelle
original
als 100.000 Einträge undtobeupdated
mehr 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!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.
quelle