2017-07-18 4 views
0

Bitte können Sie mir helfen, ich diese Ausnahme immermySQL lange Abfrage Sperre Timeout Ausnahme

 Lock wait timeout exceeded; try restarting transaction 

und ich bin mit dieser Abfrage.

UPDATE Table1 INNER JOIN Table2 
    SET Table1.xCoord = Table2.Longitude, Table1.yCoord = Table2.Latitude, 
    Table1.location2 = CONCAT(Table2.Street, ', ', Table2.Post_Town, ', ', 
    Table2.County, ', ', Table2.Postcode, ', UK ') 
    WHERE (Table1.location2 = '' OR Table1.location2 IS NULL) AND 
    (Table1.location1 LIKE CONCAT('%', Table2.Street, '%')) 
    AND (Table2.location1 LIKE CONCAT('%', Table2.Post_Town, '%')); 

Tabelle 2 ist 30 Millionen Zeilen und Tabelle 1 ist 4000 Zeilen (wahrscheinlich zu erhöhen). Ich habe einen Index auf 1. Straße 2. Stadt. Als Antwort auf Rick gab Ive Beispieltabellen.

  • Tabelle 1

| Standort 1 || Standort 2 || Postleitzahl

|| Wohnung 30 234 Festplatte Straße morganvale || (neue Zeichenfolge hinzufügen) ||

  • Tabelle 2

|| Haus nein || Straße || Stadt || Postleitzahl || xcoord || ycoord ||

|| 234 || Festplattenstraße || Morganvale || mr12 123 || 5.1234 || 24.2345 ||

und ich stimme den Straßennamen und Stadt mit dem LIKE-Muster. Die Kommas wurden entfernt und location1 ist alles Kleinbuchstaben.

Ich benutze AWS und habe 100 GB Speicherplatz, um die Schreibgeschwindigkeit zu erhöhen, und ich benutze eine t2.small mit 2 GB RAM.

Meine Frage ist, dass diese Abfrage schneller ausgeführt werden kann und wie verhindere ich die Sperre Wartezeit Ausnahmefehler. Ist die Anfrage korrekt?


Ziel der Abfrage ist x und y-Koordinaten und einen Ort zu tabelle1 von einer 30 Millionen-Datei in table2 hinzuzufügen.

Ich habe über Alternativen nachgedacht? postgre postgis wird diese Abfrage schneller als mysql ausführen. Wie wäre es mit diesem Zusammenfügen von Tabellen aus einer Anwendung wie Java?

+0

Diese Abfrage kann keine Indizes verwenden, um die Wo-Kriterien zu beschleunigen. Erwägen Sie stattdessen Volltextindizes und Volltextsuche. – Shadow

+1

Uh, Ihre Abfrage erstellt einen kartesischen Join zwischen den 2 Tabellen, der zu 4000 * 30 Millionen Datensätzen führt, ohne dass Indizes verwendet werden können. Sie müssen diese Übung komplett überdenken. – Shadow

+0

Und wir können nicht sagen, ob die Frage corect ist oder nicht, weil wir nicht wissen, was es tun soll, noch kennen wir Ihre Daten. – Shadow

Antwort

2
  • Die Abfrage ist eine schrecklich teuflische - es muss jede Zeile von Tabelle1 mit jeder Zeile von Tabelle2 paaren; das ist 120 Milliarden Dinge zu testen. Sei froh, dass es abgebrochen wurde, anstatt bis zum 6. Sonntag dieses Monats zu laufen.
  • ODER ist ein Performance-Killer erwägen, entweder eine leere Zeichenfolge oder NULL, nicht beides auszuwählen.
  • LIKE '%xx%' wird keinen Index verwenden.
  • Verwenden Sie FULLTEXT anstelle von LIKE.
  • 2 GB RAM bedeutet entweder, dass die innodb_buffer_pool_size zu klein ist, um die gesamte Tabelle zwischenzuspeichern, oder dass sie so hoch eingestellt ist, dass sie ausgetauscht werden. (Swapping ist schrecklich für MySQL.) Finden Sie den Wert dieser Einstellung.
  • UPDATE braucht und dauert mehr schwerwiegende Sperren als SELECTs. Sehen Sie, ob Sie SELECT id FROM tbl WHERE ... ausführen können, um die IDs für die fraglichen Zeilen zu erhalten, und sehen Sie, wie lange das dauert. Dann können wir mögliche Alternativen diskutieren.
  • Bitte geben Sie für jede Tabelle SHOW CREATE TABLE an.

Fazit: Überdenken Sie den Algorithmus.

+0

Hallo Rick, würde postgresql mit der Erweiterung postgis einen solchen Anruf machbar machen? – KDJ

+1

@KDJ Mysql hat standardmäßig Geospatialdatentypen und -funktionen. Sie führen jedoch keine geospatialen Operationen durch, Sie führen Mustervergleiche durch. Also, nein, Wechsel zu Postgresql wird nichts lösen. – Shadow

+0

mit postgresql, die Tabelle wird auf dem Heap in sequentieller Reihenfolge gespeichert, so dass die Geschwindigkeit – KDJ