2015-02-18 3 views
0

Я должен выполнить запрос на обновление строк 800k и искать лучший способ сделать это. Все строки обновляются с теми же значениями, за исключением одного поля (D в моем примере). Это поле может быть 1 или 0. Я использую метод update() для Zend_Db. Думаю, около 3 методов, чтобы сделать это:Лучший способ сделать этот запрос UPDATE

  • Methode 1: обновить каждую строку, один за одним (с Еогеаспом).

  • Methode 2: Есть ли ПЧ в обновлении, чтобы установить значение поля

  • Methode 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); 

метод Witch может быть лучшим способом сделать это? Спасибо

+0

FYI: обсуждение скорости PHP и MySQL http://stackoverflow.com/questions/13176469/php-vs-mysql-performance-if-functions-in-query – AgeDeO

+0

В вашем примере кода ничего нет укажите, как вы решаете, какие строки будут установлены в 'D = 1' или' D = 0'. Это может помочь с решением. – RiggsFolly

ответ

1

Для записи строки 800k, обновленные на реальном сервере, не являются хорошим планом. За исключением того, что он выполняется на фактическом уровне 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 прогонов скрипта + пауза секунды после каждой обновленной партии).

Смежные вопросы