MySQL : abrufen einer großen Auswahl durch chunks
Ich haben, wählen Sie mit dann
70 Millionen Zeilen
Möchte ich zum speichern der ausgewählten Daten in eine große csv-Datei auf win2012 R2
Q: Wie ermittelt werden die Daten aus der MySQL von chanks für bessere Leistung ?
weil wenn ich Versuch zu speichern eine der großen wählen, ich habe
out of memory-Fehler
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie könnten versuchen, mit der
LIMIT
Funktion. Wenn Sie dies tun:Bekommst du die ersten 1.000 Feature-Zeilen. Die ersten
LIMIT
Wert (0) definiert die Start-Zeile in der Ergebnismenge. Es ist null-indiziert, so dass die 0 bedeutet "der ersten Reihe". Die zweiteLIMIT
Wert ist die maximale Anzahl von Zeilen abrufen. Um die nächsten paar 1000, dies zu tun:Und so weiter. Wenn die
SELECT
gibt keine Zeilen zurück, sind Sie fertig.Dies ist nicht genug auf seine eigene, obwohl, weil jegliche änderung an den Tisch, während Sie die Bearbeitung Ihres 1K Zeilen in einer Zeit, werfen Sie die Bestellung. Fixieren der Ergebnisse in der Zeit, starten Sie, indem Sie eine Abfrage, die Ergebnisse in eine temporäre Tabelle:
Randbemerkung: es ist eine gute Idee, um sicherzustellen, dass die temporäre Tabelle nicht vorhanden vorher:
Jedenfalls, sobald der temporären Tabelle vorhanden ist, ziehen Sie die Zeile Stücke von dort:
Werde ich überlasse es Ihnen, erstellen Sie die Logik, die berechnen den Grenzwert nach jedem Stück, und überprüfen Sie für das Ende der Ergebnisse. Ich würde auch empfehlen viel größeren Blöcken als 1.000 Datensätze; es ist nur eine Zahl, die ich rausgesucht der Luft.
Schließlich, es ist eine gute form zum löschen der temporären Tabelle, wenn Sie fertig sind:
CREATE procedure
Oder andere gute Möglichkeit wäre, es zu tun, in php und python bei einer while-Zyklus und einen spezifischen chunk-Größe für die Daten, die Sie auswählen möchten. Mein Vorschlag ist, verwenden Siepipe
undstream
mit Knoten was ist die Wert-Methode.SELECT * FROM table where item="something" LIMIT 0,1000;
Den
LIMIT OFFSET
Ansatz verlangsamt die Abfrage nach unten, wenn eine der Größe der Daten ist sehr groß. Ein weiterer Ansatz ist die Verwendung von etwas namens Keyset pagination. Es benötigt eine eindeutige id in deiner Abfrage, die Sie verwenden können, wie eine Lesezeichen-zeigen Sie die Letzte Zeile der vorherigen Seite. Auf der nächsten Seite geholt mit dem letzten Lesezeichen. Zum Beispiel:Wenn das resultset oben gibt die Letzte Zeile mit
user_id
als12345
Sie können es verwenden, um abrufen der nächsten Seite wie folgt:Weitere details, können Sie einen Blick auf diese Seite.