从MySQL提取大量数据

时间:2019-05-28 12:09:03

标签: php mysql nosql

尝试使用PHP从MySQL中提取大量数据(约200,000行)。 得到错误: PHP致命错误:允许的内存大小为xxxxx字节已用尽

我有一个应用程序,每个月产生近80-9万笔交易。这是一个不断增长的应用程序,因此我可以预期数字会迅速增长。 生成月度报告或季度报告时,出现内存大小错误。我试图增加允许的内存,它起作用了。 但是我知道允许更多的内存只是暂时的解决办法,从长远来看并不是一个好习惯。

在扩展此应用程序时,我需要一些帮助。

我认为,将查询结果分为多个可管理的块并将它们连接在一起应该可以解决问题。

还有其他更好的解决方案吗?

NoSQL在这里有帮助吗?怎么样?

编辑:

以下是使用数据的方式: 交易表包含所有交易详细信息以及对主数据的引用,例如用户ID,地点/位置ID,交易类型。

该报告将:

  • 从交易表中提取记录
  • 适当替换主引用[用名称,地址等替换用户ID]
  • 以csv / xls格式转储数据
  • 存储/下载文件

谢谢

3 个答案:

答案 0 :(得分:0)

可以不使用Mysql Aggregate函数吗?它们应该总是比拉出所有记录然后处理它们更快。 https://dev.mysql.com/doc/refman/8.0/en/group-by-functions-and-modifiers.html

答案 1 :(得分:0)

将此行代码插入脚本的顶部:

ini_set("memory_limit","128M"); // size based on your requirement if you need more than 128M then u can add this value in the place of 128M

或者如果可能的话,使用Mysql命令行:

Use yourdatabasename
source  mysqlfile

答案 2 :(得分:0)

生成器允许您编写代码,该代码使用foreach遍历一组数据,而无需在内存中构建数组,这可能会导致您超出内存限制,或需要大量的处理时间才能生成。取而代之的是,您可以编写一个生成器函数,该函数与普通函数相同,不同之处在于,生成器可以返回所需的次数,而不是返回一次,以提供要迭代的值。例如

function getRecords()
{
  $sql = 'SELECT field1, field2,field3 FROM table';
  $results=$db->query($sql);
  while ($row = $results->fetch_assoc())) {
    yield $row;
 }
}

foreach ($this->getRecords() as $record) {
  //process records here
}