Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Abrufen einer großen Auswahl nach Blöcken

Sie könnten versuchen, das LIMIT zu verwenden Merkmal. Wenn Sie dies tun:

SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000

Sie erhalten die ersten 1.000 Zeilen. Das erste LIMIT Wert (0) definiert die Startzeile in der Ergebnismenge. Es ist null-indiziert, also bedeutet 0 "die erste Zeile". Das zweite LIMIT value ist die maximale Anzahl der abzurufenden Zeilen. Um die nächsten Sätze von 1.000 zu erhalten, gehen Sie wie folgt vor:

SELECT * FROM MyTable ORDER BY whatever LIMIT 1000,1000 -- rows 1,001 - 2,000
SELECT * FROM MyTable ORDER BY whatever LIMIT 2000,1000 -- rows 2,001 - 3,000

Und so weiter. Wenn die SELECT gibt keine Zeilen zurück, fertig.

Dies allein reicht jedoch nicht aus, da alle Änderungen an der Tabelle, während Sie Ihre 1K-Zeilen gleichzeitig verarbeiten, die Bestellung durcheinander bringen. Um die Ergebnisse zeitlich einzufrieren, beginnen Sie damit, die Ergebnisse in eine temporäre Tabelle abzufragen:

CREATE TEMPORARY TABLE MyChunkedResult AS (
  SELECT *
  FROM MyTable
  ORDER BY whatever
);

Nebenbemerkung:Es ist eine gute Idee, vorher sicherzustellen, dass die temporäre Tabelle nicht existiert:

DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;

Sobald die temporäre Tabelle vorhanden ist, ziehen Sie auf jeden Fall die Zeilenblöcke von dort:

SELECT * FROM MyChunkedResult LIMIT 0, 1000;
SELECT * FROM MyChunkedResult LIMIT 1000,1000;
SELECT * FROM MyChunkedResult LIMIT 2000,1000;
.. and so on.

Ich überlasse es Ihnen, die Logik zu erstellen, die den Grenzwert nach jedem Chunk berechnet und das Ende der Ergebnisse überprüft. Ich würde auch viel größere Brocken als 1.000 Datensätze empfehlen; Es ist nur eine Zahl, die ich aus der Luft gegriffen habe.

Schließlich gehört es zum guten Ton, die temporäre Tabelle zu löschen, wenn Sie fertig sind:

DROP TEMPORARY TABLE MyChunkedResult;