2017-10-27 1 views
-1

Ich führe eine interne Abfrage mit zwei Tabellen auf dem MySQL-Server und es ist sehr langsam, es dauert 3 Stunden bis zum Ende.Innere Join-Abfrage, die mit indexierter Tabelle sehr langsam ausgeführt wird?

UPDATE table_A ta 
    JOIN table_B tb 
    ON ta.field1= tb.field1 
    AND ta.field2 = tb.field2 
    SET ta.field2 = tb.field2, 
    ta.field3 = tb.field3 
WHERE tb.field5 = 'ABC' 

TABLE_A hat 650.000 Zeilen Table_B hat 100.000 Zeilen

Sowohl ta. field1, ta. field2, tb. field1, tb. field2, tb field5 sind alle indiziert und in den EXPLAIN-Ergebnissen gezeigt.

Irgendeine Idee, wie man es schneller laufen lässt?

+0

fügen Sie die Indexerstellung sql, vielleicht Index ist falsch, offensichtlich wollen einen Index auf tb.field5 – Andrew

+0

Sie aktualisieren Felder, die Sie Index haben. Warum brauchst du es überhaupt? –

+0

Ich habe diese Frage nicht abgelehnt, aber bitte in Zukunft, wenn Sie um Hilfe zur Abfrageoptimierung bitten, fügen Sie die Ausgabe von 'SHOW CREATE TABLE' für jede Tabelle in der Abfrage ein, damit wir die Datentypen, Indizes und Einschränkungen sehen können . Nehmen Sie auch die Ausgabe von EXPLAIN auf. –

Antwort

1

Für diese Abfrage:

UPDATE `table_A` ta INNER JOIN 
     table_B tb 
     ON ta.`field1`= tb.`field1` AND ta.`field2` = tb.`field2` 
SET ta.`field2` = tb.`field2`, 
    ta.`field3` = tb.`field3` 
WHERE tb.`field5` = 'ABC'; 

Es besteht keine Notwendigkeit field2 zu aktualisieren, da der neue Wert der gleiche wie der alte Wert (basierend auf dem join Zustand).

Einer dieser Index Ansätze sollten am besten funktionieren:

  • table_B(field1, field2, field5)
  • table_B(field5, field1, field2), table_A(field1, field2)

Was ist besser, hängt von der Art der Daten funktioniert. Es ist jedoch sehr wichtig, dass Sie zusammengesetzte Indizes verwenden, nicht separate Indizes für jedes Feld.

+0

Ok. werde beides ausprobieren und sehen .. Danke! –

+0

Warum aktualisieren Sie field2? !?! – Strawberry

+0

@Strawberry. . . Das ist eine wirklich gute Frage. Fragen Sie das OP. –