执行此UPDATE查询的最佳方法

时间:2015-02-18 13:51:25

标签: php mysql sql zend-db mariadb

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

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

  • Methode 2:在更新中设置IF以设置字段的值

  • 方法3:将行分为两组(一组用field = 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);

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

1 个答案:

答案 0 :(得分:1)

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

现在,正如所说,假设您正在运行MySql,

方法1。如果只有800k行=>则不可行。 800k查询。 php.ini中的max_timeout不允许脚本运行那么久。如果您仍想尝试它,请尝试将结果拼接成50-100-200的批次(取决于您的服务器配置)并运行每个批次之间的时间差。做一批,等一下,做一批,等一下,等等......

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

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

通常,当有这样的大批量更新时,我会说,从命令行使用mysql。 如果这是您正在运行的更新PHP脚本,最好的结果是拼接结果并一次更新50-100-任何数字。虽然耗费时间(一次800.000rows / 100rows =脚本800次运行+每次更新批次后暂停一秒)。

相关问题