Du kan prøve at bruge LIMIT
funktion. Hvis du gør dette:
SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000
Du får de første 1.000 rækker. Den første LIMIT
værdi (0) definerer startrækken i resultatsættet. Det er nulindekseret, så 0 betyder "den første række". Den anden LIMIT
værdi er det maksimale antal rækker at hente. For at få de næste par sæt af 1.000 skal du gøre dette:
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
Og så videre. Når SELECT
returnerer ingen rækker, du er færdig.
Dette er dog ikke nok i sig selv, fordi enhver ændring af tabellen, mens du behandler dine 1.000 rækker ad gangen, vil afvise ordren. For at fryse resultaterne i tide, start med at forespørge resultaterne i en midlertidig tabel:
CREATE TEMPORARY TABLE MyChunkedResult AS (
SELECT *
FROM MyTable
ORDER BY whatever
);
Sidebemærkning:det er en god idé at sikre, at den midlertidige tabel ikke eksisterer på forhånd:
DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;
I hvert fald, når det midlertidige bord er på plads, skal du trække rækkestykkerne derfra:
SELECT * FROM MyChunkedResult LIMIT 0, 1000;
SELECT * FROM MyChunkedResult LIMIT 1000,1000;
SELECT * FROM MyChunkedResult LIMIT 2000,1000;
.. and so on.
Jeg overlader det til dig at oprette logikken, der beregner grænseværdien efter hver del og kontrollerer slutningen af resultaterne. Jeg vil også anbefale meget større bidder end 1.000 plader; det er bare et nummer, jeg har plukket ud af luften.
Endelig er det en god form at droppe den midlertidige tabel, når du er færdig:
DROP TEMPORARY TABLE MyChunkedResult;