该表大约是1.2M行(它的主动上升,因此在此测试的迭代之间总行数略有增加,但这不会改变结果)。
显示mysql_num_rows - 这是准确的,使用选择计数(*)进行测试 - 在拉取查询之后,以显示结果集的大小。
然后,循环将行分配给具有 mysql_fetch_array()的数组。迭代计数器在每一轮都会递增,你会期望它到达 mysql_num_rows ,然后跳出while循环。非常标准的东西,已经完成了一百万次。
另一方面,实际发生的事情很奇怪。它完全达到1/2方式(floor(number_of_rows / 2))然后 mysql_fetch_array()返回false。无论你如何限制结果集......
$iteration = 0;
$result = mysql_query("select `file_id`, `size` from `files`", $dbconn); // get all records
echo "\nDone. Found " . mysql_num_rows($result) . " rows."; // Done. Found 1291595 rows.
if ($result){
while ($line = mysql_fetch_array($result) !== false){
$iteration++;
}
echo "\ngot to $iteration before mysql_fetch_array was false."; // got to 642679 before mysql_fetch_array was false.
}
有时$ line是一个空数组,有时mysql_fetch_array触发false。
它获得了mysql_num_rows,我期望并继续为总结果集大小的1/2记录,然后它停止...
如果我现在放,限制= 967356,1000000,我得到:
Done. Found 324963 rows.
got to 162482 before mysql_fetch_array was false.
这是正好1/2的方式。
limit = 1000000,1000000:
Done. Found 292606 rows.
got to 146303 before mysql_fetch_array was false.
这可能是世界上的什么?
php info:
php -v PHP 5.4.19-1 + debphp.org~precision + 3(cli)(内置:2013年8月27日14:29:42) 版权所有(c)1997-2013 PHP小组
答案 0 :(得分:1)
为了避免在php将$line
的值解释为false的情况下提前终止while循环,请更改行
while ($line = mysql_fetch_array($result)){
到
while (($line = mysql_fetch_array($result)) !== FALSE){
另一种可能性是你在非常大的结果集上耗尽了内存。尝试使用mysql_unbuffered_query
代替mysql_query()
。
另一种可能性是您在此脚本中打开了多个数据库连接,而mysql_query()
未使用您认为正在使用的那个。传递可选的第二个参数以确定。变化
mysql_fetch_array($result)
到
mysql_fetch_array($result, $dbconn)
答案 1 :(得分:1)