[英]Best way to do this UPDATE query
我必须对80万行进行更新查询,并寻找执行此操作的最佳方法。 除了一个字段(在我的示例中为D)以外,所有行均以相同的值更新。 该字段可以是1或0。我使用Zend_Db的update()方法。 我认为有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);
巫婆方法可以做到这一点的最好方法吗? 谢谢
据记录,在实时生产服务器上更新80万行不是一个好的计划。 除了在实际的mysql级别上进行之外,此更新停止服务器的几率很高。
话虽如此,假设您正在运行MySql,
如果您仅拥有800k行=> 800k查询,那么方法1.是不可行的。 php.ini中的max_timeout不允许脚本运行那么长时间。 如果仍要尝试,请尝试将结果拼接成50-100-200的批次(取决于您的服务器配置),然后运行每个批次并在它们之间存在时间差。 做一批,等一下,做一批,等一下,依此类推...
方法2。我认为它与您的特定问题有关,但是会更快。
方法3。请参阅方法1的答案,但不是一次即可获得800k,而是取决于0与1之间的比率。 这将是两个非常大的查询。
通常,当有这样的大批量更新时,我会说,从命令行使用mysql。 如果这是您正在运行的更新php脚本,则最好的结果是拼接结果并一次更新50-100(无论多少)。 尽管这很耗时(一次800.000行/ 100行=脚本运行800次+每批更新后暂停一秒钟)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.