首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL更新查询优化-子查询?

问MySQL更新查询优化-子查询?
EN

Stack Overflow用户
提问于 2010-12-17 00:33:29
回答 2查看 815关注 0票数 4

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

query1:

代码语言:javascript
复制
UPDATE items, brands SET items.brand_id = brands.id WHERE brands.name = 'apple'

--vs--

query2:

代码语言:javascript
复制
UPDATE items SET brand_id = (SELECT id FROM brands WHERE name = 'apple')

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-17 01:09:31

我希望它们的运行速度一样快,但在大约4M条记录上运行测试innoDB表显示了以下结果:

代码语言:javascript
复制
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等语句中基本上是不确定的)

票数 5
EN

Stack Overflow用户

发布于 2010-12-17 02:13:04

第一个查询将在更新之前有效地执行一个cross-join,这是非常糟糕的性能。

第二个查询将为外部表中的每一行运行子查询,就性能而言,这是非常糟糕的。

都不是特别好..。只是哪一个更糟糕的问题。:)

您想要更新整个items表吗?

您是否尝试过查找两个查询的等价SELECT的@EXPLAIN?

代码语言:javascript
复制
EXPLAIN
SELECT items.brand_id, brands.id 
FROM items, brands 
WHERE brands.name = 'apple'

和

代码语言:javascript
复制
EXPLAIN 
SELECT brand_id, id
FROM items, (SELECT id FROM brands WHERE name = 'apple') a

更妙的是,运行UPDATEs / equivilent SELECTSs并执行一些SHOW STATUS LIKE 'handler_%',以查看正在读/写的确切行数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4463052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档