执行此UPDATE查询的最佳方式


Best way to do this UPDATE query

我必须对800k行进行更新查询,并寻找最好的方法。除了一个字段(在我的示例中为D)外,所有行都用相同的值更新。此字段可以是1或0。我使用Zend_Db的update()方法。我认为有三种方法可以做到这一点:

  • 方法1:更新每一行,一行接一行(使用foreach)。

  • 方法2:在更新中执行IF以设置字段的值

  • 方法3:将行分为两组(一组字段=1,另一组字段=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);

女巫的方法可能是最好的方法吗?感谢

根据记录,在实时生产服务器上更新800k行不是一个好计划。除了在实际的mysql级别上完成外,此更新停止服务器的可能性很高。

话虽如此,假设你运行的是MySql,

方法1.如果您有800k行=>800k个查询,那么方法是不可行的。php.ini中的max_timeout不允许脚本运行那么长时间。如果你仍然想尝试,可以尝试将结果拼接成50-100-200个批次(取决于你的服务器配置),并在每个批次之间有时间差的情况下运行。做一批,等一秒钟,做一批、等一秒钟等等…

方法2。我想这与你的某个问题有关,但会更快。

方法3。请参阅方法1的答案,只是它不是一次800k,而是取决于0和1之间的比例。这将是两个查询,每个查询都相当大。

通常,当有这样的大批量更新时,我会说,从命令行使用mysql。如果这是您正在运行的更新php脚本,那么最好的结果是拼接结果并一次更新50-100个数字。尽管这很耗时(一次800.000行/100行=800次脚本运行+每次更新批次后暂停一秒钟)。