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
wuliao8
V2EX  ›  MySQL

求高手帮忙看一下联表查询,如何优化,谢谢!

  •  
  •   wuliao8 · 2016-08-03 08:38:54 +08:00 · 2911 次点击
    这是一个创建于 3070 天前的主题,其中的信息可能已经有所发展或是发生改变。

    A 表待更新,有 20 万数据,无索引; B 表,有 70 万数据,无索引,ID 有重复项,查找的值一样;

    UPDATE test AS A, ( SELECT ID,NAME,FILE,DIS FROM users GROUP BY(ID)) AS B SET A.dizhi = B.name,A.FILE= B.FILE,A.DIS = B.DIS WHERE A.ID = B.ID

    17 条回复    2016-08-03 17:54:24 +08:00
    wuliao8
        1
    wuliao8  
    OP
       2016-08-03 09:13:11 +08:00
    这个两种表的查询请问有什么高效的办法么? Mysql5.6
    huixia0010
        2
    huixia0010  
       2016-08-03 09:18:08 +08:00   ❤️ 1
    无索引- -主键呢,这种奇葩数据库,服
    nightspirit
        3
    nightspirit  
       2016-08-03 09:20:54 +08:00   ❤️ 1
    这是生产环境还是什么?应用场景是什么?
    wuliao8
        4
    wuliao8  
    OP
       2016-08-03 09:30:05 +08:00
    @nightspirit 只是本机运行,存储数据,更新数据
    wuliao8
        5
    wuliao8  
    OP
       2016-08-03 09:30:52 +08:00
    @huixia0010 无索引,也无主键, google 说有索引的 UPDATE 更慢
    li24361
        6
    li24361  
       2016-08-03 09:55:49 +08:00   ❤️ 1
    @wuliao8 分情况吧,如果是海量数据高速插入,更新,索引确实会更慢,但 70w ,这么点,加上索引,明显能够提升 A.ID = B.ID 效率
    nightspirit
        7
    nightspirit  
       2016-08-03 10:27:02 +08:00
    @wuliao8 有索引慢是因为,写入数据会构造索引,所以慢, SELECT ID,NAME,FILE,DIS FROM users GROUP BY(ID)这个子句这样写时用不到索引的,所以这个场景索引没啥用,你现在这个效率低也主要是这个子句,如果加索引可以加在 id 上,然后分步查询利用 id , id>某常数,这样循环更新表,不过你只是在本地的化,貌似也不需要什么效率问题,如果是生产环境,就可以考虑在本地做一部分,然后在上线时候,增量生产的那一部分,可以利用 read lock 。
    y10n
        8
    y10n  
       2016-08-03 10:30:57 +08:00   ❤️ 1
    A 表 主键加索引
    B 表 普通索引
    会不会好点?
    luluuulu4848
        9
    luluuulu4848  
       2016-08-03 10:38:25 +08:00   ❤️ 1
    其实有时候拆开写能快点
    表大的时候产生的笛卡尔积会很大
    数据量如果很大的时候
    SELECT ID,NAME,FILE,DIS FROM users GROUP BY(ID) 可以先查出来
    然后 batchUpdate A 表
    反而会快点
    saintatgod
        10
    saintatgod  
       2016-08-03 11:21:33 +08:00
    赞成 @luluuulu4848 的看法。
    同时考虑加上索引,这个数据量,性能影响不大
    wuliao8
        11
    wuliao8  
    OP
       2016-08-03 11:34:34 +08:00
    @nightspirit 话说创建临时表更快些,还没实践。
    现在这个语句 update4000 条都花了半个多小时,还没结束,不知道要多久
    wuliao8
        12
    wuliao8  
    OP
       2016-08-03 11:37:56 +08:00
    @luluuulu4848 初学 mysql , batchUpdate 是什么东东?
    wander2008
        13
    wander2008  
       2016-08-03 11:42:17 +08:00 via iPhone
    explain 看一下 ok ?话说干嘛不让代码去跑
    nightspirit
        14
    nightspirit  
       2016-08-03 13:57:21 +08:00
    @wuliao8 没可能这么慢的,你是写的脚本更新的,还是直接执行的 sql 语句额?
    luluuulu4848
        15
    luluuulu4848  
       2016-08-03 17:04:36 +08:00
    @wuliao8 批量更新 一次提交事务
    wuliao8
        16
    wuliao8  
    OP
       2016-08-03 17:16:03 +08:00
    @nightspirit 直接执行的啊 sql 语句啊
    dishuibaby
        17
    dishuibaby  
       2016-08-03 17:54:24 +08:00
    建议加上索引。 70W 的数据瞬间索引就加上了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1003 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 18:54 · PVG 02:54 · LAX 10:54 · JFK 13:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.