sql >> Base de Datos >  >> RDS >> Mysql

MySQL:recupera una gran selección por fragmentos

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;