Je zou kunnen proberen de LIMIT
. te gebruiken functie. Als je dit doet:
SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000
U krijgt de eerste 1.000 rijen. De eerste LIMIT
waarde (0) definieert de startrij in de resultatenset. Het is nul-geïndexeerd, dus 0 betekent "de eerste rij". De tweede LIMIT
waarde is het maximale aantal rijen dat moet worden opgehaald. Ga als volgt te werk om de volgende paar sets van 1.000 te krijgen:
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
Enzovoort. Wanneer de SELECT
geeft geen rijen terug, je bent klaar.
Dit is op zichzelf echter niet genoeg, omdat alle wijzigingen die aan de tabel worden aangebracht terwijl u uw 1K rijen per keer verwerkt, de volgorde zullen verstoren. Om de resultaten in de tijd te bevriezen, begint u met het opvragen van de resultaten in een tijdelijke tabel:
CREATE TEMPORARY TABLE MyChunkedResult AS (
SELECT *
FROM MyTable
ORDER BY whatever
);
Kanttekening:het is een goed idee om ervoor te zorgen dat de tijdelijke tafel niet op voorhand bestaat:
DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;
In ieder geval, als de tijdelijke tabel eenmaal op zijn plaats is, trek je de rij-brokken daar vandaan:
SELECT * FROM MyChunkedResult LIMIT 0, 1000;
SELECT * FROM MyChunkedResult LIMIT 1000,1000;
SELECT * FROM MyChunkedResult LIMIT 2000,1000;
.. and so on.
Ik laat het aan jou over om de logica te creëren die de grenswaarde na elk stuk berekent en het einde van de resultaten controleert. Ik zou ook veel grotere stukken aanraden dan 1.000 platen; het is gewoon een nummer dat ik uit de lucht heb geplukt.
Ten slotte is het een goede vorm om de tijdelijke tabel te laten vallen als je klaar bent:
DROP TEMPORARY TABLE MyChunkedResult;