mysql - 在 MySql 表上批量执行 UPDATE 是否比一个一个地执行 UPDATE 更快?

标签 mysql sql performance

我需要在 MySql 表上一个接一个地运行 UPDATE 查询约 500 次。我想知道这两者中哪一个的性能更好?

  1. UPDATE 'latency_table' SET 'is_active' = null WHERE rule_id = 1;

  2. UPDATE 'latency_table' SET 'is_active' = null where rule_id in (1...500);

在 #1 中,我访问表约 500 次,但在 #2 中,我访问表一次,但仍然访问行 500 次。 #2 是更高效的解决方案吗?

最佳答案

您发送到 DBMS 的每个语句都必须被解析。所以你向 DBMS 发送你的 SQL,DBMS 说:“啊更新。哪个表?latency_table。哪些行?行 ID 1。让我们考虑如何快速到达那里......我有索引吗?是的,所以对于一行,使用它是有意义的。要更新哪些列以及使用哪些值?列 is_active 和 null。好的。让我们这样做。“

对于单个语句,您执行大约 500 次。第二次只有一次。

然后你从某处触发语句。所以某个地方必须与 DBMS 对话:“嘿,我有一个声明给你”。 - “谢谢,我刚刚检查过了。看起来没问题。” ——“好,那请执行吧。” - “完成。您的更新影响了 500 行。”无论哪个应用程序都会发生这种情况,即使这是像 phpmyadmin 这样的数据库工具。这称为往返。您发送的每条语句都会发生这种小谈话。

最后,对于单个语句,您不会给 DBMS 任何优化的机会。假设您要更新 600 行中的 500 行。这几乎是所有行。如果您发送单个更新,DBMS 将搜索这条记录。如果有索引,它会通过二进制搜索快速找到它(看#300 行。更小?看第 150 行。更大?看第 225 行...)否则它必须读取整个表。对于每一个陈述。 500 次。如果您只为 500 行发送一条语句,DBMS 肯定会注意到为每个规则 ID 遍历索引会很麻烦,而宁愿只按顺序读取一次表就完成了。

也许 DBMS 甚至可以并行执行您的语句。四个 CPU 核心?那么每个CPU核可能同时关心150条记录。

因此:在一个更新语句中执行此操作的原因有很多。毕竟,这就是 SQL 的意义所在。不要担心 DBMS 可能如何解决问题。告诉它做什么(更新这 500 行)而不是如何(一个接一个)。它甚至可能决定执行 500 行,就好像您发送了 500 条语句一样,而且速度仍然快得多,因为只解析一次并且往返次数少得多。

关于mysql - 在 MySql 表上批量执行 UPDATE 是否比一个一个地执行 UPDATE 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52941320/

相关文章:

javascript - 视差效果 - 消除部分之间的差距

c++ - 发布构建与调试构建性能

mysql - x 和 y 值之间有 2 列 mysql

php - PDO 和数据库类 - 获取表模式

mysql - 在mysql语句中回显?

sql - Bash 脚本 - 带引号的命令中的 If 语句

performance - 为什么list++需要扫描list左边的所有元素?

mysql - Yii2 使用 where AND 和 OR 进行循环分组

mysql - 根据主键合并两个表

sql - 数据库中的分区和索引有什么区别? (性能方面)