Doctrine本机查询(createNativeQuery)选择查询100万行高内存使用率

时间:2015-08-15 19:10:07

标签: php mysql pdo doctrine-orm

我正在尝试使用Doctrine选择一百万行但是遇到了一些问题。

首先我尝试使用ORM查询,但后来我发现原生查询更快。(我不需要ORM映射)。

我已经在使用数组保护器(因为我只需要读取数据,因此创建对象毫无意义)。

我也听说过PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY,但如果我将其关闭,我会收到错误,因为我正在同时处理多个结果集(游标)。

因此内存使用率非常高。 对于大约1.3密尔行的一个整数列,大约100 MB ram。

我的代码的示例部分(使用非自定义HYDRATE_ARRAY):

function getResult() { 
$rsm = new ResultSetMapping;
$q = $this->getEntityManager()->
createNativeQuery("select {$this->getTableIdColName()} 
from {$this->getTableName()}", $rsm);
return $q->iterate(null, \Doctrine\ORM\Query::HYDRATE_ARRAY);
}

在调用所述函数时,即使我根本不迭代它 - 也会占用内存。 我还制作了一个自定义水合器,几乎和默认水分器一样,但使用的内存更少(因为它没有映射列名)。但结果并不好。

我是否遗漏了某些内容,或者查询在没有使用结果的情况下获取100 MB内存是否正常?

1 个答案:

答案 0 :(得分:0)

问题在于查询缓冲,对于任何感兴趣的人:

http://php.net/manual/en/mysqlinfo.concepts.buffering.php

默认情况下,它已启用,因此整个结果将保留在内存中。

基本上这可以解决问题,但它会带来一些限制:

  1. 要求您在对数据库进行新查询之前使用/关闭所有结果(学说没有内部方法可以关闭它们)
  2. $em->getConnection()->getWrappedConnection()->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);