Si potrebbe provare a utilizzare la funzione LIMIT
. Se si esegue questa operazione:
SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000
Otterrete le prime 1.000 righe. Il primo valore LIMIT
(0) definisce la riga iniziale nel set di risultati. È indicizzato a zero, quindi 0 significa "la prima riga". Il secondo valore LIMIT
è il numero massimo di righe da recuperare. Per ottenere i successivi pochi set di 1.000, fare questo:
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 lo SELECT
non restituisce alcuna riga, il gioco è fatto.
Questo non è sufficiente da solo, poiché qualsiasi modifica apportata alla tabella durante l'elaborazione delle righe 1K alla volta comporta l'eliminazione dell'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 per assicurarsi che la tabella temporanea non esiste a priori: il
DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;
in ogni caso, una volta che la tabella temporanea è a posto, tirare i pezzi di fila 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 voi per creare la logica che calcolerà il valore limite dopo ogni blocco e controlla la fine dei risultati. Raccomanderei anche pezzi molto più grandi di 1.000 dischi; è solo un numero che ho scelto per via aerea.
Infine, è buona norma eliminare la tabella temporanea quando hai finito:
DROP TEMPORARY TABLE MyChunkedResult;