通过PHP从MySQL获取100K行时的奇怪行为

时间:2012-05-25 19:56:38

标签: php mysql large-data-volumes

在这里寻找一些想法......我有一个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获取数据的问题。 / p>

在相关的说明中,while循环中的代码是存在的,因为在分解$ results数组之前,while循环只会落在大约45000条记录(每次都是相同的位置)。这是因为某个地方我错过了吗?

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

干杯!

2 个答案:

答案 0 :(得分:1)

您正在构建一系列结果,并计算新数组的成员。所以是的,预期的行为是,在获取第一行之后,您将得到“1结果”,然后是“2结果”等等......

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

答案 1 :(得分:0)

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

至于缺少最后20000行,请注意,只有在processResults()超过$ctr

后,您才会运行$kMAX_RECORDS