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

Posted

技术标签:

【中文标题】从 mysql 数据库查询中使用 php 时加快 csv 导出【英文标题】:Speed up csv export when using php from mysql database query 【发布时间】:2012-10-13 15:21:49 【问题描述】:

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

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

那么,我的问题是,缓慢的主要原因是什么?是不是查询的数据结果集太大了,以至于遇到了内存问题?因此,我应该为该过程留出更多内存吗?或者,有没有更有效的方法从我没有做的 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);

欢迎任何建议!感谢您的阅读!

【问题讨论】:

您能否提供一个您的导出过程的程序流程的伪代码示例? 当然可以!本质上是: $query = $this->db->select('field1, field2, field3')->where_in('field1',$values_array)->get('tablename'); $data = $this->dbutil->csv_from_result($download_query, $delimiter, $newline); // 保存文件的一些代码 $this->load->helper('download'); force_download($filename, $filedata);我无法让代码正确设置样式!对不起! @John 将代码放在原帖中。 【参考方案1】:

暂时忽略 Codeigniter,您基本上有三个使用 php 导出 CSV 的选项:

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于从 mysql 数据库查询中使用 php 时加快 csv 导出的主要内容,如果未能解决你的问题,请参考以下文章

如何加快从数据库中保存文件

加快从 pandas 数据帧到 mysql 的数据插入

如何加快 LIMIT 子句中偏移量较大的 MySQL 查询?

如何加快对 3 个表的 MySQL 查询(总共大约 60M 行)

当数千个条目时如何加快数据库查询[关闭]

使用 Select 表单过滤使用 PHP 从 MySQL 查询的表