insert-into

___ answer40397899 ___

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.

    
___ qstntxt ___

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.

    
___ answer19269671 ___

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.

    
___ answer19724048 ___

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

    
___ qstnhdr ___ Warum fügt MySQL in ... select ... 'so viel langsamer ein als ein select alleine? ___ tag123performance ___ Für Fragen zur Messung oder Verbesserung der Code- und Anwendungseffizienz. ___ tag123mysql ___ MySQL ist ein freies, relationales Datenbank-Managementsystem (RDBMS), das die strukturierte Abfragesprache (SQL) verwendet. Verwenden Sie dieses Tag NICHT für andere DBs wie SQL Server, SQLite usw. Dies sind verschiedene DBs, die alle SQL verwenden, um die Daten zu verwalten. ___ tag123mysqlcluster ___ MySQL NDB Cluster ist eine skalierbare ACID-kompatible Transaktionsdatenbank in Echtzeit, die für eine Verfügbarkeit von 99,999% ausgelegt ist. ___ tag123temptables ___ Temporäre Tabellen sind eine Funktion von RDBMS zum Speichern von Zwischenergebnissen. Einige RDBMS unterscheiden zwischen lokalen und globalen temporären Tabellen. Temporäre Tabellen werden normalerweise gelöscht, wenn die Sitzung für local endet oder wenn die temporäre Tabelle nicht mehr auf global verweist. Beachten Sie, dass eine temporäre Tabelle nicht mit einer Tabellenvariablen identisch ist, obwohl beide temporär sind. ___ tag123Insertion in ___ Die "INSERT INTO" ist eine SQL-Anweisung, die zum Einfügen neuer Zeilen in eine Tabelle verwendet wird. ___
3
Antworten

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

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 e...
09.10.2013, 10:12