从mysql数据库查询使用php时加速csv导出

时间:2012-10-23 16:08:09

标签: php mysql codeigniter csv

好的,所以我有一个网络系统(建立在codeigniter上,运行在mysql上),允许人们通过一系列表格的选择来查询邮政地址数据的数据库,直到他们到达想要的选择,很标准的东西。然后他们可以购买该信息并通过该系统下载。

查询运行速度非常快,但是当涉及将该查询应用于数据库并将其导出到csv时,一旦数据集达到30,000个记录标记(每行有大约40列,其中大约20个都是每个单元平均填充20个数据字符)可能需要5分钟左右才能导出到csv。

所以,我的问题是,缓慢的主要原因是什么?来自查询的数据的结果集是如此之大,以至于它遇到内存问题?因此,我应该为这个过程留出更多的记忆吗?或者,有没有一种更有效的方法从我不做的mysql查询导出到csv?我应该将查询的内容保存到临时表,只需将临时表导出到csv吗?或者我是否认为这一切都错了?此外,由于它存储结果集的方式,我使用Codeigniters Active Record这个禁令的事实是什么?

伪代码:

$query = $this->db->select('field1, field2, field3')->where_in('field1',$values_array)->get('tablename');
$data = $this->dbutil->csv_from_result($download_query, $delimiter, $newline); // the some code to save the file
$this->load->helper('download');
force_download($filename, $filedata);

欢迎任何建议!谢谢你的阅读!

2 个答案:

答案 0 :(得分:2)

暂时忽略Codeigniter,你基本上有three options for exporting CSV using PHP

  • 到磁盘 - 通常是最慢的选项
  • 记忆 - 通常是最快的选择
  • 直接访问浏览器

在您的情况下,我会跳过任何内置的Codeigniter CSV功能,并尝试直接流式传输到浏览器(请参阅上面的链接以获取完整的示例)。

答案 1 :(得分:0)

30,000条记录* 40列* 20字节= 24,000,000字节

如果这是一个繁忙的共享服务器,那么我可以想象这是一个磁盘I / O瓶颈。如果它是基于Windows的服务器,那么可能会发生一些分页,以减慢它的速度。

尝试跳过磁盘并直接写入网络。