не могу обновить таблицу MySQL с более чем 10000 записей

0

Мой код здесь

$query = "SELECT * FROM `table`";
$result = mysql_query($query);
 $arr = array();
 while($info = mysql_fetch_array($result)) {

 if (!in_array($info['row'], $arr)) {
 $arr[] = $info['row'];
 }
 }

foreach ($arr as $v) {
 $pass = "pass";
$query2 = "UPDATE `table` SET pass = '$pass'  WHERE row = '$v'";
$result2 = mysql_query($query2);
}

он обрабатывается в течение 2 минут, и ничего не происходит в db. где я могу ошибаться?

Спасибо

EDIT: ОК, я нашел свою ошибку. Речь идет о коде, который я написал для создания случайного прохода, который я не включил в мой вопрос. спасибо всем тебе

  • 0
    Я видел «mysql ушел» при работе с большим набором данных. Не уверен в этом случае, но что произойдет при попытке с меньшим, как "select column1 from tableName"? Также, если вы можете поставить некоторые записи, чтобы сузить проблему. Может быть, запустите первый запрос и убедитесь, что он работает нормально, а затем попробуйте второй запрос вместо того, чтобы делать их за один раз?
  • 0
    Ваш код не имеет явных ошибок. Попробуйте распечатать первый запрос и остановить скрипт. Затем вставьте этот код SQL в интерфейс базы данных. Это работает?
Показать ещё 1 комментарий
Теги:

1 ответ

1
Лучший ответ

Одна из возможностей заключается в том, что у вас заканчивается память: сохраняя все строки в массиве, вам нужно много памяти, прежде чем вы даже попадете в часть обновления - в этом случае это полностью объясняет, почему вы не видите никаких изменений; script никогда не попадает в эту часть.

Другая возможность заключается в том, что ваш script работает слишком долго и останавливается. В зависимости от конфигурации вашего сервера в этом случае может быть опция set_time_limit.

Однако эффект script, который вы нам показываете, точно такой же, как этот единственный запрос:

UPDATE `table` SET pass = 'pass'

так как у вас нет условий для строк в элементе выбора, и единственная фильтрация, которую вы делаете, состоит в том, чтобы не хранить несколько строк с тем же значением в столбце строки, - но когда вы переходите к пропуску обновления, вы определяете каждый строка через столбец строк, то есть он обновит все строки с тем же значением в столбце строки. Если значения строк уникальны для каждой строки, тогда нет необходимости проверять, что вы уже видели строку; если он не уникален, тогда при обновлении вам нужны другие критерии.

Если вы запустите обновление напрямую, PHP не потребуется использовать тонну памяти, и MySQL не будет искать каждую отдельную строку во время обновления; он может просто перебирать их всех за один раз. Если вы не оставите что-то здесь, вам будет намного лучше, просто сделав этот простой запрос.

  • 0
    Первый цикл работает хорошо, я могу напечатать массив с 8000 записей. значения не уникальны, так как «pass» - это случайно сгенерированные числа (я не писал здесь код), и я хотел обновить строки с теми же данными, передавая каждый из них, передавая var. я проверю этот лимит времени выставлю set_time_limit (0);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню