Du kan prova att använda LIMIT
funktion. Om du gör detta:
SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000
Du får de första 1 000 raderna. Den första LIMIT
värde (0) definierar startraden i resultatuppsättningen. Det är nollindexerat, så 0 betyder "första raden". Den andra LIMIT
värde är det maximala antalet rader att hämta. Gör så här för att få de kommande uppsättningarna med 1 000:
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
Och så vidare. När SELECT
returnerar inga rader, du är klar.
Detta är dock inte tillräckligt i sig, eftersom alla ändringar som görs i tabellen medan du bearbetar dina 1K rader åt gången kommer att kasta bort beställningen. För att frysa resultaten i tid, börja med att söka efter resultaten i en tillfällig tabell:
CREATE TEMPORARY TABLE MyChunkedResult AS (
SELECT *
FROM MyTable
ORDER BY whatever
);
Sidanteckning:det är en bra idé att se till att den tillfälliga tabellen inte finns i förväg:
DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;
I alla fall, när det tillfälliga bordet är på plats, dra radbitarna därifrån:
SELECT * FROM MyChunkedResult LIMIT 0, 1000;
SELECT * FROM MyChunkedResult LIMIT 1000,1000;
SELECT * FROM MyChunkedResult LIMIT 2000,1000;
.. and so on.
Jag överlåter åt dig att skapa logiken som kommer att beräkna gränsvärdet efter varje bit och kontrollera efter slutet av resultaten. Jag skulle också rekommendera mycket större bitar än 1 000 skivor; det är bara en siffra jag plockade ur luften.
Slutligen är det bra att släppa den tillfälliga tabellen när du är klar:
DROP TEMPORARY TABLE MyChunkedResult;