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 · 4204 views
    This topic created in 3678 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   ·   Solana   ·   5490 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 01:38 · PVG 09:38 · LAX 18:38 · JFK 21:38
    ♥ Do have faith in what you're doing.