sql >> Databasteknik >  >> RDS >> Mysql

MySQL:hämta ett stort urval i bitar

Du kan prova att använda LIMIT funktion. Om du gör detta:

SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000

Du får de första 1 000 raderna. Den första LIMIT värde (0) definierar startraden i resultatuppsättningen. Det är nollindexerat, så 0 betyder "första raden". Den andra LIMIT värde är det maximala antalet rader att hämta. Gör så här för att få de kommande uppsättningarna med 1 000:

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

Och så vidare. När SELECT returnerar inga rader, du är klar.

Detta är dock inte tillräckligt i sig, eftersom alla ändringar som görs i tabellen medan du bearbetar dina 1K rader åt gången kommer att kasta bort beställningen. För att frysa resultaten i tid, börja med att söka efter resultaten i en tillfällig tabell:

CREATE TEMPORARY TABLE MyChunkedResult AS (
  SELECT *
  FROM MyTable
  ORDER BY whatever
);

Sidanteckning:det är en bra idé att se till att den tillfälliga tabellen inte finns i förväg:

DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;

I alla fall, när det tillfälliga bordet är på plats, dra radbitarna därifrån:

SELECT * FROM MyChunkedResult LIMIT 0, 1000;
SELECT * FROM MyChunkedResult LIMIT 1000,1000;
SELECT * FROM MyChunkedResult LIMIT 2000,1000;
.. and so on.

Jag överlåter åt dig att skapa logiken som kommer att beräkna gränsvärdet efter varje bit och kontrollera efter slutet av resultaten. Jag skulle också rekommendera mycket större bitar än 1 000 skivor; det är bara en siffra jag plockade ur luften.

Slutligen är det bra att släppa den tillfälliga tabellen när du är klar:

DROP TEMPORARY TABLE MyChunkedResult;


  1. Enkel underfråga med OuterRef

  2. Prestandakonsekvenser av att tillåta att alias används i HAVING-klausulen

  3. Hur timeofday() fungerar i PostgreSQL

  4. mysql_insert_id med uppdatering