我有一个奇怪的时间处理从大约30,000行的表中选择。
看起来我的脚本使用了一个非常大量的内存,这是一个简单的,向前转的查询结果。
请注意,这个例子是一个有点设计,绝对的最低限度的例子,它与真正的代码非常相似,它不能被简单的数据库聚合替换。它旨在说明每一行不需要在每次迭代中保留的一点。
$pdo = new PDO('mysql:host=127.0.0.1', 'foo', 'bar', array(
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
));
$stmt = $pdo->prepare('SELECT * FROM round');
$stmt->execute();
function do_stuff($row) {}
$c = 0;
while ($row = $stmt->fetch()) {
// do something with the object that doesn't involve keeping
// it around and can't be done in SQL
do_stuff($row);
$row = null;
++$c;
}
var_dump($c);
var_dump(memory_get_usage());
var_dump(memory_get_peak_usage());
输出:
int(39508)
int(43005064)
int(43018120)
我不明白为什么在任何时候几乎没有任何数据需要使用40兆的内存。我已经计算出来,我可以通过将“SELECT *”替换为“SELECT home”,将“SELECT *”替换为“6”,从而将内存减少到6倍,但是我认为即使这种使用情况非常高,表只会变大。
有没有我缺少的设置,还是PDO有一些我应该注意的限制?我很高兴摆脱PDO赞成mysqli,如果它不能支持这一点,所以如果这是我唯一的选择,我该如何使用mysqli来执行这个?