2010-03-24 3 views
0

J'ai grande table de base de données, environ 5 Go, maintenant je wan pour obtenirCurrentSnapshot de base de données en utilisant "Select * from MyTableName", utilise PDO en PHP pour interagir avec la base de données. Ainsi, la préparation d'une requête, puis l'exécuterComment actualiser l'instantané de MySQL Table et le stocker dans un fichier CSV (après l'avoir créé)?

 // Execute the prepared query 
     $result->execute(); 
     $resultCollection = $result->fetchAll(PDO::FETCH_ASSOC); 

est pas un moyen efficace que beaucoup de mémoire est l'utilisateur pour le stockage dans les données de tableau associatif qui est à peu près, 5GB.

Mon but final est de collecter les données renvoyées par Select dans un fichier CSV et de placer le fichier CSV dans un emplacement FTP à partir duquel le client peut l'obtenir.

Autre option que je pensais faire:

SELECT * INTO OUTFILE "c:/mydata.csv" 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY "\n" 
FROM my_table; 

Mais je ne suis pas sûr que cela fonctionnerait comme je l'ai Cron qui initie le processus complet et nous ne disposons pas d'un fichier csv, donc en gros pour cette approche,

  1. PHP Scripts devra créer un fichier CSV.
  2. Effectuer une requête de sélection dans la base de données.
  3. Stockez le résultat de la requête de sélection dans le fichier CSV.

Quel serait le meilleur ou le plus efficace pour effectuer ce genre de tâche?

Toutes les suggestions !!!

+0

Avez-vous besoin d'utiliser PHP? Ne pouvez-vous pas vider une table en utilisant mysql depuis la ligne de commande ou un script shell? –

+0

@Manos: Je dois utiliser PHP et je ne peux pas directement exporter une table en utilisant mysql depuis la ligne de commande ou un script shell. – Rachel

Répondre

0

Vous pouvez utiliser la fonction php fputcsv (see the PHP Manual) pour écrire des lignes simples de CSV dans un fichier. Afin de ne pas rencontrer le problème de mémoire, au lieu de récupérer tout le jeu de résultats, il suffit de le sélectionner puis de parcourir le résultat:

$fp = fopen('file.csv', 'w'); 

$result->execute(); 
while ($row = $result->fetch(PDO::FETCH_ASSOC)) { 
    // and here you can simply export every row to a file: 
    fputcsv($fp, $row); 
} 
fclose($fp); 
+0

@Cassy: Si je fais fetch (PDO :: FETCH_ASSOC) pour chaque fois, est-ce que cela va maintenant affecter les performances de ma base de données? – Rachel

+0

Le jeu de résultats est mis en cache dans la base de données et chaque fois que vous effectuez un fetch(), vous ne transférez que les données de la base de données vers votre script. FetchAll() fait implicitement la même chose. Donc non, l'impact sur la base de données n'est pas tellement différent par rapport à fetchAll() –

+0

Il me semble que vous pourriez probablement réduire l'utilisation du cache de base de données en batchant les requêtes avec 'LIMIT'. Juste nichent au-dessus du code dans une autre boucle 'while'. Dépend simplement si vous devez minimiser l'utilisation de la mémoire par rapport au traitement des requêtes. – keithjgrant

Questions connexes