Podría intentar usar el LIMIT
rasgo. Si haces esto:
SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000
Obtendrá las primeras 1000 filas. El primer LIMIT
valor (0) define la fila de inicio en el conjunto de resultados. Está indexado a cero, por lo que 0 significa "la primera fila". El segundo LIMIT
value es el número máximo de filas a recuperar. Para obtener los próximos conjuntos de 1000, haga lo siguiente:
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
Y así. Cuando el SELECT
no devuelve filas, ya está.
Sin embargo, esto no es suficiente por sí solo, porque cualquier cambio realizado en la tabla mientras procesa sus filas de 1K a la vez anulará el pedido. Para congelar los resultados a tiempo, comience consultando los resultados en una tabla temporal:
CREATE TEMPORARY TABLE MyChunkedResult AS (
SELECT *
FROM MyTable
ORDER BY whatever
);
Nota al margen:es una buena idea asegurarse de que la tabla temporal no exista de antemano:
DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;
En cualquier caso, una vez que la tabla temporal esté en su lugar, extraiga los fragmentos de fila de allí:
SELECT * FROM MyChunkedResult LIMIT 0, 1000;
SELECT * FROM MyChunkedResult LIMIT 1000,1000;
SELECT * FROM MyChunkedResult LIMIT 2000,1000;
.. and so on.
Te dejaré a ti crear la lógica que calculará el valor límite después de cada fragmento y verificará el final de los resultados. También recomendaría fragmentos mucho más grandes que 1000 registros; es solo un número que elegí del aire.
Finalmente, es una buena forma eliminar la tabla temporal cuando haya terminado:
DROP TEMPORARY TABLE MyChunkedResult;