mysql 怎么 update 选择 select 的内容。

2016-06-27 11:20:38 +08:00
 ebony0319
我刚开始会很简单,但是一查各种说法的都有。 update 怎么去更新表以 select 的内容呢?
3524 次点击
所在节点    MySQL
12 条回复
HypoChen
2016-06-27 11:40:59 +08:00
in
hiboshi
2016-06-27 11:41:51 +08:00
update xxx where id in ( select id from table where xxx=xx)
这样?
anexplore
2016-06-27 11:44:09 +08:00
@hiboshi 效率如何
otakustay
2016-06-27 11:53:27 +08:00
@anexplore mysql 的 in 很快,效率取决于后面那个 where 有没有跑索引
skydiver
2016-06-27 12:31:11 +08:00
@otakustay mysql 的 in 效率很低,里面会循环的每条记录都运行一遍
otakustay
2016-06-27 14:55:38 +08:00
@skydiver 你所谓的每条记录都运行一遍,是运行什么? in 的字段(这个 case 中是 id )有索引的时候根本不需要走全表
skydiver
2016-06-27 15:03:49 +08:00
@otakustay 你可以 explain 一下看看。

mysql 会认为 in 语句里面是 dependent subquery ,然后就变成了扫外面的全表,然后再对每条记录进行里面的子查询。所以速度非常慢。

所以在 mysql 里要尽量用 join 而不要用 in 子查询。
otakustay
2016-06-27 16:01:42 +08:00
@skydiver 做了一下实际尝试,结果如下:

https://gist.github.com/otakustay/c0278141a8f74e3d2a744df8d32c48d2

在索引得当的情况下,并未看到有 dependent subquery

mysql Ver 14.14 Distrib 5.7.13, for osx10.11 (x86_64) using EditLine wrapper
otakustay
2016-06-27 16:03:02 +08:00
@skydiver 又试了一下,主句是 update 的时候确实是 dependent subquery ,我思考问题的时候把两者分离了,并未实际考虑到 update 和 select 的不同,我的错
justfindu
2016-06-27 16:04:31 +08:00
@otakustay
@skydiver 你们两个讲的肯定不是同一个 mysql 版本~ in 效率在 5.7 很大提升...5.5 之前的貌似是挺慢= =
szopen
2016-06-27 16:09:27 +08:00
ebony0319
2016-06-27 16:53:30 +08:00
@szopen 搞懂了,必须用 INNER JOIN ,顺便补充一下,最好在之前设置: SET SQL_SAFE_UPDATES = 0;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/288545

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX