Ricerca incrementale su risultato MySQL

2

Quando si esportano dati in un file di grandi dimensioni, cerco di prendere l'abitudine di generare in modo incrementale i dati in blocchi, per evitare di leggere l'intero file di grandi dimensioni in memoria. Come esempio per mostrare cosa intendo:

$fp = fopen('path/to/file.txt', 'r');
while (!feof($fp)) {
    echo fread($fp, 8192);
}
fclose($fp);

Questa stessa pratica sarebbe possibile quando si recuperano i valori da un risultato del database? Se é cosi, come? Per quanto ne so, la possibilità di recuperare i risultati unbuffered da MySQL si applica solo a una riga per riga - e non per colonna.

Un esempio di base è mostrato di seguito (sono consapevole che l'estensione mysql è deprecata - questo è solo a scopo illustrativo):

$q = mysql_incremental('SELECT 'filedata' FROM 'large_files' WHERE 'id' = 1');
while (!mysql_incremental_eof($q, 'filedata')) {
    echo mysql_fetch_incremental($q, 'filedata');
}
mysql_free_result($q);

Una possibile soluzione che ho pensato è quella di combinare più query per porzioni del file, facendo uso della funzione SUBSTRING() disponibile in MySQL. Immagino che anche se questo potrebbe essere più efficiente in termini di memoria, mi chiedo quale sarebbe l'effetto sull'utilizzo della rete e sull'attività del disco?

    
posta garbetjie 03.09.2013 - 11:04
fonte

1 risposta

1

se il database contiene file di grandi dimensioni che non si desidera vengano inviati nella loro interezza, il database presenta un difetto di progettazione. A seconda di come è finito il tuo codice, potrebbe non valere la pena correggere il difetto ... ma dato che stai per risparmiare sulla memoria, probabilmente è un buon punto di partenza.

Crea un nuovo set di record composto dai blocchi che desideri per ogni pagina dalla tabella large_files . Puoi provare a farlo come una vista, o potrebbe essere necessario creare una tabella.

Se l'avviso del database non è un'opzione, scrivi il tuo file di grandi dimensioni su disco in una posizione temporanea sul tuo server php e leggilo come faresti con qualsiasi altro file flat.

(in linea di massima tutta la separazione del file aumenterà il traffico e / o l'utilizzo del disco, supponendo che il client desideri tutto il file. E se il client NON vuole sempre l'intero file, questo è un altro segno di un difetto di progettazione del database.)

    
risposta data 03.09.2013 - 16:10
fonte

Leggi altre domande sui tag