执行此 UPDATE 查询的最佳方法

Best way to do this UPDATE query

我必须执行 80 万行的更新查询并寻找执行此操作的最佳方法。除了一个字段(在我的示例中为 D)之外,所有行都使用相同的值进行更新。该字段可以是 1 或 0。我使用 Zend_Db 的 update() 方法。 我考虑了 3 种方法来做到这一点:

查询如下所示:

$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,

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

方法二我猜是你的某个问题,但是会更快

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

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