2015-12-09 26 views
8

devo selezionare con più diMySQL: retrive un grande Selezione per pezzi

70 milion righe

mi piacerebbe salvare i dati selezionati in un unico grande file CSV su win2012 R2

D: Come recuperare i dati da MySQL per migliorare le prestazioni?

perché quando cerco di salvare una grande selezionare Ho

errori di memoria

Grazie di tutto l'aiuto!

risposta

13

Si potrebbe provare a utilizzare la funzione LIMIT. Se si esegue questa operazione:

SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000 

Otterrete le prime 1.000 righe. Il primo valore LIMIT (0) definisce la riga iniziale nel set di risultati. È indicizzato a zero, quindi 0 significa "la prima riga". Il secondo valore LIMIT è il numero massimo di righe da recuperare. Per ottenere i successivi pochi set di 1.000, fare questo:

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 lo SELECT non restituisce alcuna riga, il gioco è fatto.

Questo non è sufficiente da solo, poiché qualsiasi modifica apportata alla tabella durante l'elaborazione delle righe 1K alla volta comporta l'eliminazione dell'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 per assicurarsi che la tabella temporanea non esiste a priori: il

DROP TEMPORARY TABLE IF EXISTS MyChunkedResult; 

in ogni caso, una volta che la tabella temporanea è a posto, tirare i pezzi di fila 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 voi per creare la logica che calcolerà il valore limite dopo ogni blocco e controlla la fine dei risultati. Raccomanderei anche pezzi molto più grandi di 1.000 dischi; è solo un numero che ho scelto per via aerea.

Infine, è buona norma eliminare la tabella temporanea quando hai finito:

DROP TEMPORARY TABLE MyChunkedResult;