哪个查询最快:我自己的测试没有显示任何明显的结果:
UPDATE items, brands SET items.brand_id = brands.id WHERE brands.name = 'apple'
- VS -
UPDATE items SET brand_id = (SELECT id FROM brands WHERE name = 'apple')
我无法在Google上找到任何关于此的数据;也许这里有一些SQL专家知道答案?
只看语法,我个人更喜欢第一个。虽然我说的其他人更喜欢第二种(更明显)?
答案 0 :(得分:5)
我希望它们运行速度相同,但在〜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
)
答案 1 :(得分:0)
第一个查询将在更新之前有效地执行cross-join,这是非常糟糕的性能。
第二个查询将为外表中的每一行运行该子查询,这在性能上非常糟糕。
两者都不是特别好......只是更糟糕的事情。 :)
您的意思是更新整个items
表吗?
您是否尝试过查看两个查询的等效EXPLAIN
的{{1}}个?
SELECT
和
EXPLAIN
SELECT items.brand_id, brands.id
FROM items, brands
WHERE brands.name = 'apple'
更好的是,运行EXPLAIN
SELECT brand_id, id
FROM items, (SELECT id FROM brands WHERE name = 'apple') a
s / equivilent UPDATE
并执行一些SELECTS
以查看正在读取/写入的行数。