Potresti provare a usare il LIMIT
caratteristica. Se lo fai:
SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000
Otterrai le prime 1.000 righe. Il primo LIMIT
il valore (0) definisce la riga iniziale nel set di risultati. È indicizzato a zero, quindi 0 significa "la prima riga". Il secondo LIMIT
value è il numero massimo di righe da recuperare. Per ottenere i prossimi set di 1.000, procedere come segue:
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
E così via. Quando il SELECT
restituisce nessuna riga, il gioco è fatto.
Questo non è abbastanza da solo, però, perché qualsiasi modifica apportata alla tabella mentre elabori le tue righe 1K alla volta annullerà l'ordine. Per bloccare i risultati nel tempo, inizia interrogando i risultati in una tabella temporanea:
CREATE TEMPORARY TABLE MyChunkedResult AS (
SELECT *
FROM MyTable
ORDER BY whatever
);
Nota a margine:è una buona idea assicurarsi che la tabella temporanea non esista in anticipo:
DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;
Ad ogni modo, una volta che la tabella temporanea è a posto, estrai i blocchi di riga da lì:
SELECT * FROM MyChunkedResult LIMIT 0, 1000;
SELECT * FROM MyChunkedResult LIMIT 1000,1000;
SELECT * FROM MyChunkedResult LIMIT 2000,1000;
.. and so on.
Lascio a te creare la logica che calcolerà il valore limite dopo ogni blocco e verificherà la fine dei risultati. Consiglierei anche blocchi molto più grandi di 1.000 record; è solo un numero che ho scelto dall'aria.
Infine, è buona norma eliminare la tabella temporanea quando hai finito:
DROP TEMPORARY TABLE MyChunkedResult;