MySQL 更新查询优化 - 是否有子查询?

标签 mysql performance sql-update

哪个查询最快:我自己的测试没有显示任何明显的结果:

查询1:

UPDATE items, brands SET items.brand_id = brands.id WHERE brands.name = 'apple'

--对比--

查询2:

UPDATE items SET brand_id = (SELECT id FROM brands WHERE name = 'apple')

我无法通过 Google 找到这方面的任何数据;也许这里的一些 SQL 专家知道答案?

就语法而言,我个人更喜欢第一种。而我所说的其他人更喜欢第二种(因为更明显)?

最佳答案

我希望它们运行得同样快,但是在 ~4M 记录 innoDB 表上运行测试显示以下结果:

mysql> update t, (select now() value) onerow set update_date = onerow.value;
Query OK, 3999960 rows affected (2 min 12.32 sec)
Rows matched: 3999960  Changed: 3999960  Warnings: 0

mysql> update t set update_date = (select now());
Query OK, 3999960 rows affected (1 min 28.66 sec)
Rows matched: 3999960  Changed: 3999960  Warnings: 0

(第二次运行测试结果分别为2分11.52秒和1分26.67秒)

原因可能是 mysql 处理单表更新和多表更新的方式不同,see docs .

注意:虽然它读到了 mysql 如何处理 UPDATE - 它与 SQL 标准有一些可怕的偏差(它对分配顺序敏感,这在单表更新和多表更新之间甚至不一致表更新 - 多个表更新在诸如 UPDATE t SET column1=column1+100, column2=column1)

等语句中基本上是不确定的

关于MySQL 更新查询优化 - 是否有子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4463052/

相关文章:

php - 在 php 中,我可以在从 url 获取变量的同时循环更新数据库吗?

php - mysql 更新子查询不起作用

postgresql - 如果 Postgres 数据库中的多个列发生冲突,则更新插入

java - 有没有更快的方法来比较 Java 中的两个 Int 数组?

php - 如何在单个 sql 查询中处理多对多关系?

php - PDO 绑定(bind)参数/值不起作用

mysql - MySQL 中的重音不敏感排序

c++ - 关于 c 和/或 c++ 中数组的愚蠢问题

sql - rowversion/timestamp 是否会显着影响性能?

mysql - SQL交叉连接中的重复对?