› 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 · Aug 3, 2016 · 3758 views
    This topic created in 3705 days ago, the information mentioned may be changed or developed.

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