2010-03-24 17 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

相关问题