繁体   English   中英

执行此UPDATE查询的最佳方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM