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 · 3525 次点击
    这是一个创建于 3075 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我刚开始会很简单,但是一查各种说法的都有。 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   ·   实用小工具   ·   5662 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 06:40 · PVG 14:40 · LAX 22:40 · JFK 01:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.