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

241 天前
 kaiki
需要在 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 表,有什么好的方案吗?
1709 次点击
所在节点    MySQL
13 条回复
akira
241 天前
b 表先自己 group 呢
kaiki
241 天前
@akira 这个要怎么写?
akira
241 天前
根据你的描述,

现在我把 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
241 天前
贴 explain
kaiki
241 天前
@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;
glitterzhong
241 天前
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
241 天前
小菜鸡一枚
1. 直接 a 表冗余这个字段,b 表变化去更新 a 表,主要考虑更新频繁不频繁, 这样每次只需查 a 表即可。
2. 尝试 3 楼的方法 先 group by b 表 再通过 uid 关联,b 的 uid 建立索引
kaiki
241 天前
@glitterzhong 按照你的写法,确实快了几倍,从原来的拉几十倍变成拉十几倍了,感觉还有优化空间,可能确实是分表再关联这个做法有问题
RedBeanIce
241 天前
GROUP_CONCAT 包裹的一个或者多个字段,,,最长 1024 ,望周知。
kaiki
241 天前
@RedBeanIce 这个可以改配置文件的,不过查出来的数据都是一些数字,也不会到这么长
Morii
241 天前
放 explain 结果被
表结构没有,索引怎么做的也没说,执行计划也不放,大家只能盲人摸象般的帮你分析,效率太低了
janwarlen
240 天前
如果主表是 a ,表 b 的查询只是补充数据,完全可以拆分为两个操作执行吧?
RainCats
240 天前
看起来是完全可以拆成两个单表查询

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/972603

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX