Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:recupera un'ampia selezione per blocchi

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;