Zur Zeit habe ich eine MySQL-Abfrage, die ich in PHP laufen und wenn Sie durch die Ergebnisse gehen ich die Original-Tabelle, sondern eine einfache Tabelle aktualisieren mit 500 Reihen 30 Sekunden dauert abzuschließen:Warum ist diese MySQL-Abfrage meinen Code zu verlangsamen
$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);
}
Liegt es daran, dass ich die Tabelle aktualisiere, aus der ich mich auswähle? Ich habe dieses Problem gelöst, indem Sie folgendermaßen vorgehen, sondern weil die Tabelle Tausende von Datensätzen in der Zukunft haben könnte, ich bin nicht sicher, wie gut die IN halten wird:
$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) . ')');
Warum werden alle Zeilen abgerufen und nach ID aktualisiert, anstatt nur basierend auf den Bedingungen, die Sie in SELECT verwendet haben, zu aktualisieren? – geoffspear
In diesem wählen (ich hätte das wahrscheinlich angezeigt) Ich wähle mehr Daten, verwenden Sie es für die Verarbeitung und einmal verwendet, muss ich dies angeben, indem Sie verarbeitete = 1, so dass ich im nächsten Lauf kann es überspringen. – ChimeraTheory
Wenn Sie nur die Spalte 'processed' aktualisieren, gibt es keinen Grund, eine 'SELECT'- und eine 'UPDATE'-Abfrage auszuführen. Sie können dies mit der unten angegebenen Antwort @Truth tun. Die andere Option besteht darin, ein Array von bearbeiteten Daten zu verwenden und alles in zwei Abfragen zu kombinieren. – gorelative