Я использую цикл while, чтобы извлекать записи из mysql. это для сброса журнала, который был взломан при аварии, поэтому я исправляю предыдущие записи, вытаскивая идентификатор и метку времени из резервной копии БД и обновляя производственную таблицу этими значениями.Использование памяти php во время цикла
Я надеялся ограничить использование памяти и думал, что это решение будет использовать намного меньше, так как в этой таблице журналов есть 12 545 628 записей. Потяните только поля идентификатора и отметки времени, которые он обрывает через 1 ГБ памяти довольно быстро.
Является ли это ограничение использования памяти одной записью за раз, или она использует то же самое, что и прямое вытягивание всех идентификаторов и штампов времени и отслеживание их?
(я имею установки класса базы данных, так что PDO может выглядеть странно)
$sql = 'SELECT id, timestamp FROM log_people WHERE 1';
$Test->sqlQuery($sql);
while ($testdb = $Test->sth->fetch(PDO::FETCH_ASSOC)) {
$Prod->beginTransaction();
try {
$sql2 = 'UPDATE log_people SET timestamp = "'.$testdb['timestamp'].'" WHERE id = '.$testdb['id'];
$Prod->sqlQuery($sql2);
} catch (exception $err) {
$Prod->rollback();
echo $err->getMessage();
}
}
Должен ли я делать ниже код, чтобы просто тянуть и изменить одну запись за один раз?
while ($count < 12545628){
$sql = 'SELECT id, timestamp FROM log_people WHERE id ='.$count;
$Test->sqlQuery($sql);
$testdb = $Test->sth->fetch(PDO::FETCH_ASSOC)
$Prod->beginTransaction();
try {
$sql2 = 'UPDATE log_people SET timestamp = "'.$testdb['timestamp'].'" WHERE id = '.$testdb['id'];
$Prod->sqlQuery($sql2);
$count++;
} catch (exception $err) {
$Prod->rollback();
//return $err->getMessage();
echo $err->getMessage();
}
}
Так скажите нам - зачем вам «выбирать» все записи? Если все записи должны быть обновлены - зачем их выбирать? –
Не могли бы вы сделать это намного быстрее и быстрее, поставив копию таблицы резервного копирования в том же БД и используя SQL для обновления производственной таблицы? Зачем это делать в PHP? –