php - 执行此 UPDATE 查询的最佳方法

标签 php mysql sql zend-db mariadb

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

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

  • 方法2:在update中执行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);

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

最佳答案

郑重声明,在实时生产服务器上更新 80 万行并不是一个好的计划。除了在实际的 mysql 级别完成之外,此更新停止您的服务器的可能性很高。

现在,话虽如此,假设您正在运行 MySql,

如果您有 800k 行 => 800k 查询,则方法 1. 不可行。 php.ini 中的 max_timeout 不允许脚本运行那么长时间。如果您仍想尝试,请尝试将结果拼接成 50-100-200 个批处理(取决于您的服务器配置),并在每个批处理之间存在时间差来运行每个批处理。执行一批,等待一秒钟,执行一批,等待一秒钟,依此类推...

方法2。我猜它与您的特定问题有关,但会更快。

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

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

关于php - 执行此 UPDATE 查询的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28585297/

相关文章:

php - MySQL+PHP : Storing data as JSON vs joins

java - jsonResponse.getJSONArray 不工作

mysql - 从临时表插入到另一个表

php - 对 PHP 的 Ajax 调用仅返回 "status 200 OK"但没有包含数据库结果的数组?

mysql - 两个综合指数还是一个?

php - 如何从foreach循环内的数组中删除对象?

php - 为什么php向mysql数据库插入字符串变量时需要包含引号

mysql - SQL 按通配符排序

java - 连接到数据库时 SQL 语法错误 (JAVA)

MySql 查询 - 跨多个表的数学计算