1

在这里寻找一些想法......我有一个 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 条记录(每次都在同一个地方)时结束。这是由于我错过了某个地方的设置吗?

感谢您的任何意见......只需要一些关于在哪里寻找答案的想法。

干杯!

4

2 回答 2

1

您正在构建一个结果数组,并计算该新数组的成员。所以是的,在获取第一行之后,您会得到“1 个结果”,然后是“2 个结果”,等等……

如果您想获得预期的总行数,您需要使用mysql_num_rows()

于 2012-05-25T19:59:09.173 回答
0

当您开始查看结果时,您的结果$ctr没有任何价值,并且第一次递增会将其评估为 0。但是当您到达时,$kMAX_RECORDS您将其重置为 1 而不是 0。但是我不知道为什么您在第一次调用时看到少 1 行processResults(). 我觉得应该再来一张。

至于缺少最后 20000 行,请注意您processResults()仅在$ctr超过后才运行$kMAX_RECORDS

于 2012-05-25T20:13:41.310 回答