› 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 · Jun 27, 2016 · 4359 views
    This topic created in 3756 days ago, the information mentioned may be changed or developed.
    我刚开始会很简单,但是一查各种说法的都有。 update 怎么去更新表以 select 的内容呢?
    12 replies  •  2016-06-27 16:53:30 +08:00
    Hyponet
        1
    Hyponet  
       Jun 27, 2016
    in
    hiboshi
        2
    hiboshi  
       Jun 27, 2016
    update xxx where id in ( select id from table where xxx=xx)
    这样?
    eycfsjd
        3
    eycfsjd  
       Jun 27, 2016
    @hiboshi 效率如何
    otakustay
        4
    otakustay  
       Jun 27, 2016
    @anexplore mysql 的 in 很快,效率取决于后面那个 where 有没有跑索引
    skydiver
        5
    skydiver  
       Jun 27, 2016
    @otakustay mysql 的 in 效率很低,里面会循环的每条记录都运行一遍
    otakustay
        6
    otakustay  
       Jun 27, 2016
    @skydiver 你所谓的每条记录都运行一遍,是运行什么? in 的字段(这个 case 中是 id )有索引的时候根本不需要走全表
    skydiver
        7
    skydiver  
       Jun 27, 2016
    @otakustay 你可以 explain 一下看看。

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

    所以在 mysql 里要尽量用 join 而不要用 in 子查询。
    otakustay
        8
    otakustay  
       Jun 27, 2016
    @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  
       Jun 27, 2016
    @skydiver 又试了一下,主句是 update 的时候确实是 dependent subquery ,我思考问题的时候把两者分离了,并未实际考虑到 update 和 select 的不同,我的错
    justfindu
        10
    justfindu  
       Jun 27, 2016
    @otakustay
    @skydiver 你们两个讲的肯定不是同一个 mysql 版本~ in 效率在 5.7 很大提升...5.5 之前的貌似是挺慢= =
    szopen
        11
    szopen  
       Jun 27, 2016
    ebony0319
        12
    ebony0319  
    OP
       Jun 27, 2016
    @szopen 搞懂了,必须用 INNER JOIN ,顺便补充一下,最好在之前设置: SET SQL_SAFE_UPDATES = 0;
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3682 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 04:57 · PVG 12:57 · LAX 21:57 · JFK 00:57
    ♥ Do have faith in what you're doing.