Warum fügt MySQL in ... select ... 'so viel langsamer ein als ein select alleine?

9

Ich versuche, ein Abfrageergebnis in einer temporären Tabelle für die weitere Verarbeitung zu speichern.

%Vor%

Aber aus irgendeinem Grund dauert der Einsatz bis zu einer Minute, während der Subselect nur wenige Sekunden dauert. Warum würde es so viel länger dauern, die Daten in eine temporäre Tabelle zu schreiben, anstatt sie in die Ausgabe meines SQL-Management-Tools zu schreiben ???

UPDATE Meine Einrichtung: MySQL 7.3.2 Cluster mit 8 Debian Linux ndb Datenknoten 1 SQL-Knoten (Windows Server 2012)

Die Tabelle, auf der ich die Auswahl ausführe, ist eine ndb-Tabelle.

Ich habe versucht herauszufinden, ob der Ausführungsplan bei der Verwendung von 'Einfügen in ..' anders ist, aber sie sehen gleich aus: (Entschuldigung für die Formatierung, stackoverflow hat keine Tabellen)

%Vor%

CREATE TABLE ... SELECT ist auch langsam. 47 Sekunden vs. 5 Sekunden ohne Tabelle einfügen / erstellen.

    
Ben 09.10.2013, 10:12
quelle

3 Antworten

1

Ich habe oben einen Kommentar geschrieben und bin dann als Workaround darüber gestolpert.

Damit wird erreicht, was Sie tun möchten.

%Vor%

Beachten Sie, dass dies die Verwaltung der / tmp-Tabellen in irgendeiner Weise bedeutet. Wenn Sie versuchen, Daten in eine OUTFILE zu WÄHLEN, die bereits existiert, erhalten Sie einen Fehler. Sie müssen also eindeutige temporäre Dateinamen generieren. Und dann führe einen Cron-Job aus, um sie aufzuräumen.

Ich denke, INFILE und OUTFILE verhalten sich anders. Wenn jemand etwas Licht auf das werfen könnte, was hier geschieht, um mysql Verhalten zu erklären, würde ich es schätzen.

D

Hier ist ein besserer Weg als mit INFILE / OUTFILE.

SET TRANSACTION ISOLATION LEVEL READ VERPFLICHTET;    EINFÜGEN IN EINE TABELLE    SELECT ... VON ...

Hier ist ein relevanter Beitrag zu lesen:

Verbessern des INSERT INTO ... SELECT-Sperrverhaltens

    
Don Wool 01.11.2013 09:29
quelle
1

Ich habe das gleiche Problem und habe mit Unterabfragen herumgespielt, die es tatsächlich gelöst haben. Wenn die Auswahl eine große Anzahl von Zeilen enthält, dauert es sehr lange, um die Daten einzufügen. Beispiel:

%Vor%

die Verwendung von LIMIT in Kombination mit INSERT-Daten ist keine gute Option. Sie können also zwei separate Abfragen zum Abrufen und Einfügen von Daten verwenden oder eine Unterabfrage verwenden. Beispiel:

%Vor%

das wäre eine schnelle Lösung, ohne Ihr Skript zu ändern.

Ich bin mir also nicht sicher, warum es 0,01 Sekunden dauert, um die Unterabfrage auszuführen, und 60 Sekunden, um die Einfügung auszuführen. Ich bekomme 1000+ Ergebnisse ohne Limit. In meinem Fall verbesserte die Unterabfrage die Leistung von 60 Sekunden auf 0,01 Sekunden.

    
joevette 03.11.2016 09:28
quelle
0

Der Grund hat damit zu tun, wie der Computer liest und schreibt und wie eine temporäre Datei funktioniert. Select liest Daten, die sich in einer indizierten Datei auf der Festplatte befinden, während insert eine temporäre Datei verwendet und in diese Datei schreibt. Mehr Arbeitsspeicher ist erforderlich und dies ist schwieriger. Warum es eine Minute dauert, bin ich mir nicht genau sicher, aber ich denke, der Code könnte ein wenig falsch sein, das würde dazu beitragen.

    
Ben Cartwright 09.10.2013 10:36
quelle