多くの行を選択するクエリを実行しています。結果をループするときは、一度に 1 つの行をフェッチする必要があります (すべてを一度にフェッチするにはメモリが多すぎるため)。
問題は、すべてのバリエーションに対する CodeIgniter のアクティブ レコード $query->row が、データベースからすべてのレコードをメモリに取得する (そして単一の行を返す) ことです。DB_result.php のソースを調べたところ、次のことがわかりました。
public function row_object($n = 0)
{
$result = $this->result_object();
if (count($result) == 0)
{
return $result;
}
if ($n != $this->current_row AND isset($result[$n]))
{
$this->current_row = $n;
}
return $result[$this->current_row];
}
および result_object() 内:
...
while ($row = $this->_fetch_assoc())
{
$this->result_array[] = $row;
}
これにより、すべてのレコードがデータベースからメモリにフェッチされます。
結果セット全体をメモリにロードせずに単一の行をフェッチできるようにする回避策はありますか?