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

Tji*_*irp 4 mysql performance sql-update

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

QUERY1:

UPDATE items, brands SET items.brand_id = brands.id WHERE brands.name = 'apple'
Run Code Online (Sandbox Code Playgroud)

--vs--

QUERY2:

UPDATE items SET brand_id = (SELECT id FROM brands WHERE name = 'apple')
Run Code Online (Sandbox Code Playgroud)

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

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

Unr*_*son 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
Run Code Online (Sandbox Code Playgroud)

(第二次跑步测试分别为2分11.52秒和1分26.67秒)

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

注意:在阅读有关mysql如何处理的内容时UPDATE- 它与SQL标准有一些可怕的偏差(它对赋值顺序很敏感,在单表更新和多表更新之间甚至不一致 - 多表更新基本上是不确定的在语句如UPDATE t SET column1=column1+100, column2=column1)