mysql 怎么 update 选择 select 的内容。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
ebony0319
V2EX    MySQL

mysql 怎么 update 选择 select 的内容。

  •  
  •   ebony0319 2016-06-27 11:20:38 +08:00 3784 次点击
    这是一个创建于 3398 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我刚开始会很简单,但是一查各种说法的都有。 update 怎么去更新表以 select 的内容呢?
    12 条回复    2016-06-27 16:53:30 +08:00
    HypoChen
        1
    HypoChen  
       2016-06-27 11:40:59 +08:00
    in
    hiboshi
        2
    hiboshi  
       2016-06-27 11:41:51 +08:00
    update xxx where id in ( select id from table where xxx=xx)
    这样?
    anexplore
        3
    anexplore  
       2016-06-27 11:44:09 +08:00
    @hiboshi 效率如何
    otakustay
        4
    otakustay  
       2016-06-27 11:53:27 +08:00
    @anexplore mysql 的 in 很快,效率取决于后面那个 where 有没有跑索引
    skydiver
        5
    skydiver  
       2016-06-27 12:31:11 +08:00
    @otakustay mysql 的 in 效率很低,里面会循环的每条记录都运行一遍
    otakustay
        6
    otakustay  
       2016-06-27 14:55:38 +08:00
    @skydiver 你所谓的每条记录都运行一遍,是运行什么? in 的字段(这个 case 中是 id )有索引的时候根本不需要走全表
    skydiver
        7
    skydiver  
       2016-06-27 15:03:49 +08:00
    @otakustay 你可以 explain 一下看看。

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

    所以在 mysql 里要尽量用 join 而不要用 in 子查询。
    otakustay
        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
    otakustay
        9
    otakustay  
       2016-06-27 16:03:02 +08:00
    @skydiver 又试了一下,主句是 update 的时候确实是 dependent subquery ,我思考问题的时候把两者分离了,并未实际考虑到 update 和 select 的不同,我的错
    justfindu
        10
    justfindu  
       2016-06-27 16:04:31 +08:00
    @otakustay
    @skydiver 你们两个讲的肯定不是同一个 mysql 版本~ in 效率在 5.7 很大提升...5.5 之前的貌似是挺慢= =
    szopen
        11
    szopen  
       2016-06-27 16:09:27 +08:00
    ebony0319
        12
    ebony0319  
    OP
       2016-06-27 16:53:30 +08:00
    @szopen 搞懂了,必须用 INNER JOIN ,顺便补充一下,最好在之前设置: SET SQL_SAFE_UPDATES = 0;
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5206 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 03:46 PVG 11:46 LAX 20:46 JFK 23:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86