Yii大型SQL查询占用大量内存

时间:2014-12-04 13:12:28

标签: php apache yii

我正在使用Yii 1.1.14和php 5.3在centos 6上我使用CDbCommand从一个非常大的表中获取数据,结果集是10个列的~90,000个记录我将它导出到csv文件并且文件大小约为15MB, 脚本总是崩溃而没有任何错误消息,只有经过一些研究后我发现我需要在php.ini中提高memory_limit才能成功执行脚本。 唯一的问题是,为了成功执行,我必须将内存限制提高到512MB(!),这是很多!如果10个用户将执行相同的脚本,我的服务器将不会很好地响应......

我想知道是否有人可能知道使用Yii减少sql查询的内存消耗的方法? 我知道我可以使用限制和偏移将查询拆分为多个查询,但15MB查询消耗512MB似乎不合逻辑。

以下是代码:

set_time_limit(0);
$connection = new CDbConnection($dsn,$username,$password);
$command = $connection->createCommand('SELECT * FROM TEST_DATA');
$result = $command->queryAll(); //this is where the script crashes
print_r($result);

任何想法都将不胜感激!

谢谢,

1 个答案:

答案 0 :(得分:5)

不是使用readAll来返回单个数组中的所有行(这里存在真正的内存问题),而应该只使用foreach循环(请查看CDbDataReader),例如: :

$command = $connection->createCommand('SELECT * FROM TEST_DATA');
$rows = $command->query();
foreach ($rows as $row)
{

}

编辑:使用LIMIT

$count = Yii::app()->db->createCommand('SELECT COUNT(*) FROM TEST_DATA')->queryScalar();
$maxRows = 1000:
$maxPages = ceil($count / $maxRows);

for ($i=0;$i<$maxPages;$i++)
{
    $offset = $i * $maxRows;
    $rows = $connection->createCommand("SELECT * FROM TEST_DATA LIMIT $offset,$maxRows")->query();
    foreach ($rows as $row)
    {
      // Here your code
    }
}