1

ここでいくつかのアイデアを探しています... 100K 行のテスト データを含む MySQL テーブルがあります。

私は PHP スクリプトを使用してそのテーブルから行をフェッチしています。このテスト ケースでは、スクリプトは 100,000 行すべてをフェッチしています (大規模なデータセットのプロファイリングと最適化を行っています)。

DB に接続し、バッファリングされていないクエリを実行します。

$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_RECORDSprocessResults()

最後の 20000 行の欠落については、超過processResults()した後にのみ実行していることに注意してください$ctr$kMAX_RECORDS

于 2012-05-25T20:13:41.310 に答える