执行此 UPDATE 查询的最佳方法
Best way to do this UPDATE query
我必须执行 80 万行的更新查询并寻找执行此操作的最佳方法。除了一个字段(在我的示例中为 D)之外,所有行都使用相同的值进行更新。该字段可以是 1 或 0。我使用 Zend_Db 的 update() 方法。
我考虑了 3 种方法来做到这一点:
方法 1:逐行更新每一行(使用 foreach)。
方法二:在update中做一个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,
方法 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 + 每次更新批次后暂停一秒)。
我必须执行 80 万行的更新查询并寻找执行此操作的最佳方法。除了一个字段(在我的示例中为 D)之外,所有行都使用相同的值进行更新。该字段可以是 1 或 0。我使用 Zend_Db 的 update() 方法。 我考虑了 3 种方法来做到这一点:
方法 1:逐行更新每一行(使用 foreach)。
方法二:在update中做一个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,
方法 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 + 每次更新批次后暂停一秒)。