Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从mysql数据库查询中使用php时加快csv导出_Php_Mysql_Codeigniter_Csv - Fatal编程技术网

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

从mysql数据库查询中使用php时加快csv导出,php,mysql,codeigniter,csv,Php,Mysql,Codeigniter,Csv,好的,我已经有了一个web系统(基于codeigniter构建并运行在mysql上),它允许人们通过一系列表单进行选择来查询邮政地址数据的数据库,直到他们得到想要的、非常标准的选择。然后他们可以购买这些信息并通过该系统下载 查询运行得非常快,但是当将该查询应用到数据库并将其导出到csv时,一旦数据集达到30000个记录标记(每行大约有40列,其中大约20列的每个单元格平均填充20个字符的数据),导出到csv可能需要5分钟左右的时间 所以,我的问题是,什么是造成缓慢的主要原因?是因为查询的数据结果

好的,我已经有了一个web系统(基于codeigniter构建并运行在mysql上),它允许人们通过一系列表单进行选择来查询邮政地址数据的数据库,直到他们得到想要的、非常标准的选择。然后他们可以购买这些信息并通过该系统下载

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

所以,我的问题是,什么是造成缓慢的主要原因?是因为查询的数据结果集太大,导致内存问题吗?因此,我是否应该为进程提供更多内存?或者,有没有一种更有效的方法可以将mysql查询导出到csv,而我没有这样做?我应该将查询的内容保存到临时表中,并将临时表导出到csv吗?还是我完全错了?另外,由于存储结果集的方式,我使用Codeigniters活动记录的事实是否禁止

伪代码:

$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);

欢迎任何意见!谢谢你的阅读

30000条记录*40列*20字节=24000000字节

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


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

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

  • 到磁盘—通常是最慢的选项
  • 到内存-通常是最快的选项
  • 直接到浏览器

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

您能否提供导出过程程序流的伪代码示例?当然可以!基本上是:$query=$this->db->select('field1,field2,field3')->where_in('field1',$values_array)->get('tablename')$数据=$this->dbutil->csv_from_result($download_query,$delimiter,$newline);//保存文件$this->load->helper('download')的一些代码;强制下载($filename,$filedata);我无法使代码的样式正确!对不起@约翰把密码放在原来的帖子里。