【发布时间】:2012-06-01 09:40:31
【问题描述】:
在这里寻找一些想法...我有一个 MySQL 表,其中包含 100K 行测试数据。
我正在使用 PHP 脚本从该表中获取行,在这个测试案例中,该脚本正在获取所有 100,000 行(对大型数据集进行一些分析和优化)。
我连接到数据库,并执行一个无缓冲的查询:
$result = mysql_unbuffered_query("SELECT * FROM TestTable", $connection) or die('Errant query: ' . $query);
然后我迭代结果:
if ($result) {
while($tweet = mysql_fetch_assoc($result)) {
$ctr++;
if ($ctr > $kMAX_RECORDS) {
$masterCount += $ctr;
processResults($results);
$results = array();
$ctr = 1;
}
$results[] = array('tweet' => $tweet);
}
echo "<p/>FINISHED GATHERING RESULTS";
}
function processResults($resultSet) {
echo "<br/>PROCESSED " . count($resultSet) . " RECORDS";
}
$kMAX_RECORDS = 40000 现在,所以我希望看到如下输出:
已处理 40000 条记录
已处理 40000 条记录
已处理 20000 条记录
完成收集结果
但是,我一直看到:
处理了 39999 条记录
已处理 40000 条记录
完成收集结果
如果我在 $ctr++ 之后立即添加 $ctr 的输出,我会得到完整的 100K 记录,所以在我看来,这似乎是某种时间问题或使用 MYSQL_FETCH_ASSOC 从后端获取数据的问题。
在一个相关的注释中,while 循环中的代码在那里,因为在像这样分解 $results 数组之前,while 循环会在大约 45000 条记录(每次都在同一个地方)时失败。这是因为我错过了某个地方的设置吗?
感谢您的任何意见...只是需要一些想法来寻找这个问题的答案。
干杯!
【问题讨论】:
-
请停止使用古老的
mysql_*函数编写新代码。它们不再维护,社区已经开始 deprecation process 。相反,您应该了解prepared statements 并使用PDO 或MySQLi。如果您无法决定,this article 将帮助您选择。如果你想学习,here is a good PDO-related tutorial. -
这和问题有关系吗?我不需要学究式的 cmets,而是需要对所提出的问题有所了解。
-
不是真的,因此它是评论而不是答案。这不是迂腐(或无意),我认为那里有一些有趣的阅读可能会有所帮助。拿走还是留给你。
标签: php mysql large-data-volumes