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

求一个 sql 或重新设计表,关联两个表用 group by+GROUP_CONCAT 性能直接拉跨了

  •  
  •   kaiki · Sep 11, 2023 · 3156 views
    This topic created in 1113 days ago, the information mentioned may be changed or developed.
    需要在 a 表 select 一些数据,如 uid,name,price 。
    然后用 a 表的 id 可以在 b 表 select 到一些数据,如 uid,type,num 。
    现在我把 b 表 join 到 a 表,a.uid=b.uid ,并 group by uid ,GROUP_CONCAT(b.type,':',b.num) as i
    看起没什么问题,就是性能拉了几十倍,不取 b 表数据就没事,索引也都做了,没啥用

    现在就想解决这个问题,要么优化 sql ,要么重新设计 b 表,有什么好的方案吗?
    13 replies  •  2023-09-11 17:03:44 +08:00
    akira
        1
    akira  
       Sep 11, 2023
    b 表先自己 group 呢
    kaiki
        2
    kaiki  
    OP
       Sep 11, 2023
    @akira 这个要怎么写?
    akira
        3
    akira  
       Sep 11, 2023
    根据你的描述,

    现在我把 b 表 join 到 a 表,a.uid=b.uid ,并 group by uid ,GROUP_CONCAT(b.type,':',b.num) as i

    很明显这个 group 和 group concat 都是对 b 做的操作啊。

    select b.uid , GROUP_CONCAT(b.type,':',b.num) as i
    from b
    group by uid
    Rache1
        4
    Rache1  
       Sep 11, 2023
    贴 explain
    kaiki
        5
    kaiki  
    OP
       Sep 11, 2023
    @akira
    @Rache1
    写错了,编辑不了,又不能追加
    SELECT a.uid,a.name,a.price GROUP_CONCAT(b.type,':',b.num)as i FROM table_a a LEFT JOIN table_b b on a.uid = b.uid GROUP BY uid;
    glitter1105
        6
    glitter1105  
       Sep 11, 2023
    SELECT a.uid, a.name, a.price, i
    FROM (
    SELECT uid, name, price
    FROM a
    ) AS a
    LEFT JOIN (
    SELECT uid, GROUP_CONCAT(type, ':', num) AS i
    FROM b
    GROUP BY uid
    ) AS b ON a.uid = b.uid
    chunworkhard
        7
    chunworkhard  
       Sep 11, 2023
    小菜鸡一枚
    1. 直接 a 表冗余这个字段,b 表变化去更新 a 表,主要考虑更新频繁不频繁, 这样每次只需查 a 表即可。
    2. 尝试 3 楼的方法 先 group by b 表 再通过 uid 关联,b 的 uid 建立索引
    kaiki
        8
    kaiki  
    OP
       Sep 11, 2023
    @glitterzhong 按照你的写法,确实快了几倍,从原来的拉几十倍变成拉十几倍了,感觉还有优化空间,可能确实是分表再关联这个做法有问题
    RedBeanIce
        9
    RedBeanIce  
       Sep 11, 2023
    GROUP_CONCAT 包裹的一个或者多个字段,,,最长 1024 ,望周知。
    kaiki
        10
    kaiki  
    OP
       Sep 11, 2023
    @RedBeanIce 这个可以改配置文件的,不过查出来的数据都是一些数字,也不会到这么长
    28Sv0ngQfIE7Yloe
        11
    28Sv0ngQfIE7Yloe  
       Sep 11, 2023
    放 explain 结果被
    表结构没有,索引怎么做的也没说,执行计划也不放,大家只能盲人摸象般的帮你分析,效率太低了
    vvvVictoria
        12
    vvvVictoria  
       Sep 11, 2023
    如果主表是 a ,表 b 的查询只是补充数据,完全可以拆分为两个操作执行吧?
    RainCats
        13
    RainCats  
       Sep 11, 2023
    看起来是完全可以拆成两个单表查询
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5077 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 06:26 · PVG 14:26 · LAX 23:26 · JFK 02:26
    ♥ Do have faith in what you're doing.