Я должен сделать запрос на обновление 800k строк и ищу лучший способ сделать это. Все строки обновляются с одинаковыми значениями, за исключением одного поля (D в моем примере). Это поле может быть 1 или 0. Я использую метод update () Zend_Db.
Я думаю о 3 способах сделать это:
Метод 1: Обновите каждую строку, один за другим (с foreach).
Метод 2: сделать IF в обновлении, чтобы установить значение поля
Метод 3: Разделите строки на две группы (одна с полем = 1, а другая
с полем
= 0) и сделайте два обновления (UPDATE … WHERE id IN (…)), по одному для каждой группы.
Запрос выглядит так:
$a_data = array(
'A' => foo,
'B' => 99,
'C' => 0,
'D' => (0 OR 1 ?)
);
$where['id IN (?)'] = $a_id;
$update = $this->_db->update($this->_name, $a_data, $where);
Метод ведьмы может быть лучшим способом сделать это? Спасибо
К сведению, 800 тыс. Строк, обновленных на работающем производственном сервере, не являются хорошим планом. За исключением того, что выполняется на реальном уровне MySQL, шансы этого обновления остановить ваш сервер высоки.
Теперь, как говорится, и предполагая, что вы используете MySql,
Способ 1 не выполнимо, если только у вас есть 800k строк => 800k запросов. max_timeout в php.ini не позволит скрипту работать так долго. Если вы все еще хотите попробовать, попробуйте разделить результаты на пакеты по 50-100-200 (в зависимости от конфигурации вашего сервера) и запустить каждый пакет с разницей во времени между ними. Делать пакет, подождать секунду, сделать пакет, подождать секунду и так далее …
Способ 2 Я думаю, что это относится к вашей конкретной проблеме, но это будет быстрее.
Способ 3 см. ответ для метода 1, за исключением того, что он не 800k сразу, но зависит от соотношения между вашими 0 и 1. Это будет 2 запроса каждый довольно большой.
Обычно, когда есть большое пакетное обновление, как это, я бы сказал, использовать mysql из командной строки.
Если вы используете скрипт php для обновления, который вы запускаете, лучшие результаты — это объединение результатов и обновление 50-100-любого числа за раз. Хотя это отнимает много времени (800 000 строк / 100 строк за раз = 800 запусков сценария + пауза секунды после каждого обновленного пакета).
Других решений пока нет …