ここでいくつかのアイデアを探しています... 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 レコード (毎回同じ場所) でフォールオーバーするためです。これは、私が見逃した設定が原因ですか?
ご意見ありがとうございます...これに対する答えをどこで探すべきかについて考えてください。
乾杯!