2010-03-24 16 views
0

我有大型數據庫表,大約5GB,現在我要使用"Select * from MyTableName"獲取當前數據庫的當前快照,使用PDOPHP與數據庫進行交互。這樣製備的查詢,然後執行它如何將MySQL表的當前快照存儲到CSV文件(創建後)?

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

不是一種有效的方法爲大量內存正在被用戶用於存儲到其近似,5GB關聯數組數據。

我的最終目標是將Select查詢返回的數據收集到CSV文件中,並將CSV文件放在客戶端可以從其獲取FTP位置的FTP位置。

我認爲另一個選項是要做到:

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

但我不知道這是否會工作,我有cron的發起的完整過程,我們沒有一個CSV文件,所以基本上這方法,

  1. PHP腳本將不得不創建一個CSV文件。
  2. 對數據庫執行選擇查詢。
  3. 將選擇查詢結果存儲到CSV文件中。

什麼是最好的或有效的方式來做這種類型的任務?

任何建議!

+0

您是否必須使用PHP?難道你不能從命令行或shell腳本使用mysql轉儲表嗎? – 2010-03-24 15:37:33

+0

@Manos:我必須使用PHP,我不能直接從命令行或shell腳本使用mysql轉儲表。 – Rachel 2010-03-24 15:38:27

回答

0

您可以使用php函數fputcsv (see the PHP Manual)將單行的csv寫入文件。爲了不碰到內存問題,不要一次提取整個結果集,只需選擇它,然後遍歷結果:

$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:如果我每次都在執行抓取(PDO :: FETCH_ASSOC),那麼現在它會影響我的數據庫性能嗎? – Rachel 2010-03-24 15:39:30

+0

結果集被緩存在數據庫中,每次您執行fetch()時,您只將數據從數據庫傳輸到腳本。 FetchAll()實際上隱含地執行相同的操作。所以不,對數據庫的影響與fetchAll()相比差別不大。 – 2010-03-24 15:50:28

+0

對我來說,你可以通過使用LIMIT來批量查詢來減少數據庫緩存的使用。只需在另一個'while'循環中嵌套上面的代碼。取決於您是否需要最大限度地減少處理查詢時的內存使用量。 – keithjgrant 2010-03-24 16:17:03

相關問題