![]() | 1 HypoChen 2016-06-27 11:40:59 +08:00 in |
![]() | 2 hiboshi 2016-06-27 11:41:51 +08:00 update xxx where id in ( select id from table where xxx=xx) 这样? |
![]() | 6 otakustay 2016-06-27 14:55:38 +08:00 @skydiver 你所谓的每条记录都运行一遍,是运行什么? in 的字段(这个 case 中是 id )有索引的时候根本不需要走全表 |
![]() | 7 skydiver 2016-06-27 15:03:49 +08:00 @otakustay 你可以 explain 一下看看。 mysql 会认为 in 语句里面是 dependent subquery ,然后就变成了扫外面的全表,然后再对每条记录进行里面的子查询。所以速度非常慢。 所以在 mysql 里要尽量用 join 而不要用 in 子查询。 |
![]() | 8 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 |
![]() | 9 otakustay 2016-06-27 16:03:02 +08:00 @skydiver 又试了一下,主句是 update 的时候确实是 dependent subquery ,我思考问题的时候把两者分离了,并未实际考虑到 update 和 select 的不同,我的错 |
![]() | 10 justfindu 2016-06-27 16:04:31 +08:00 |
![]() | 11 szopen 2016-06-27 16:09:27 +08:00 |