Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:recupere uma grande seleção por pedaços


Você pode tentar usar o LIMIT característica. Se você fizer isto:
SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000

Você obterá as primeiras 1.000 linhas. O primeiro LIMIT valor (0) define a linha inicial no conjunto de resultados. É indexado a zero, então 0 significa "a primeira linha". O segundo LIMIT value é o número máximo de linhas a serem recuperadas. Para obter os próximos conjuntos de 1.000, faça o seguinte:
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 assim por diante. Quando o SELECT não retorna nenhuma linha, você terminou.

Isso não é suficiente por si só, porque quaisquer alterações feitas na tabela enquanto você está processando suas 1K linhas de cada vez prejudicarão o pedido. Para congelar os resultados no tempo, comece consultando os resultados em uma tabela temporária:
CREATE TEMPORARY TABLE MyChunkedResult AS (
  SELECT *
  FROM MyTable
  ORDER BY whatever
);

Nota lateral:é uma boa ideia garantir que a tabela temporária não exista de antemão:
DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;

De qualquer forma, uma vez que a tabela temporária esteja no lugar, puxe os pedaços de linha de lá:
SELECT * FROM MyChunkedResult LIMIT 0, 1000;
SELECT * FROM MyChunkedResult LIMIT 1000,1000;
SELECT * FROM MyChunkedResult LIMIT 2000,1000;
.. and so on.

Vou deixar para você criar a lógica que irá calcular o valor limite após cada pedaço e verificar o final dos resultados. Eu também recomendaria blocos muito maiores do que 1.000 registros; é apenas um número que eu escolhi do ar.

Por fim, é uma boa forma descartar a tabela temporária quando terminar:
DROP TEMPORARY TABLE MyChunkedResult;