MySQL更新查询优化 - 子查询与否?

时间:2010-12-16 16:33:29

标签: mysql performance sql-update

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

QUERY1:

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

- VS -

QUERY2:

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

我无法在Google上找到任何关于此的数据;也许这里有一些SQL专家知道答案?

只看语法,我个人更喜欢第一个。虽然我说的其他人更喜欢第二种(更明显)?

2 个答案:

答案 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以查看正在读取/写入的行数。