1

現在、PHP で実行する MySQL クエリがあり、結果を確認するときに元のテーブルを更新しますが、500 行の単純なテーブルが完了するまでに 30 秒かかります。

$sqlquery = mysql_query('SELECT id, special_data FROM stats_visits WHERE processed = 0');
while($row = mysql_fetch_assoc($sqlquery)){ 
    $stat_id = $row['id'];
    // Make use of special_data field for some operations
    mysql_query('UPDATE stats_visits SET processed = 1 WHERE id = ' . $stat_id);
}

選択しているテーブルを更新しているためですか?次のようにしてこれを解決しましたが、テーブルには将来何千ものレコードが含まれる可能性があるため、IN がどれだけうまく保持されるかはわかりません。

$statids = array();

$sqlquery = mysql_query('SELECT id, special_data FROM stats_visits WHERE processed = 0');
while($row = mysql_fetch_assoc($sqlquery)){ 
    $statids[] = $row['id'];
    // Make use of special_data field for some operations
}

mysql_query('UPDATE stats_visits SET processed = 1 WHERE id IN(' . implode(',', $statids) . ')');
4

3 に答える 3

6

すべてのレコードを次のように更新することだけが必要な場合はprocessed = 1、1 つのクエリで解決してみませんか?:

UPDATE `stats_visits` SET `processed` = 1 WHERE `processed` = 0;
于 2012-04-13T14:19:41.473 に答える
2

最初のバージョンでは、更新ごとに 1 回データベースにヒットしています。これは通常、悪い考えです。2番目のバージョンはデータベースに1回ヒットしています。

これが将来どうなるか心配な場合は、おそらくハイブリッドを作成してください。更新を 100 個のグループにまとめて、ブロック単位で更新します。

于 2012-04-13T14:20:21.880 に答える
1

最も簡単な方法は、更新が必要なすべての ID を配列として格納し、IN演算子を使用してこれらをクエリに内破することです。

例えば

$processedArray= array();
while($row = mysql_fetch_assoc($sqlquery)){ 
    $stat_id = $row['id'];
    //Your processing goes here
    $processedArray[] = $stat_id; //Store an id if it needs updating as processed
}

mysql_query('UPDATE stats_visits SET processed = 1 WHERE id IN ('.implode(',', $processedArray).')');
于 2012-04-13T14:39:16.120 に答える