求一个 sql 或重新设计表,关联两个表用 group by+GROUP_CONCAT 性能直接拉跨了
2023-09-11 09:10:07 +08:00
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 表数据就没事,索引也都做了,没啥用
现在我把 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
2023-09-11 09:22:13 +08:00
贴 explain
kaiki
2023-09-11 09:25:07 +08:00
@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
2023-09-11 09:28:33 +08:00
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
2023-09-11 09:33:24 +08:00
小菜鸡一枚 1. 直接 a 表冗余这个字段,b 表变化去更新 a 表,主要考虑更新频繁不频繁, 这样每次只需查 a 表即可。 2. 尝试 3 楼的方法 先 group by b 表 再通过 uid 关联,b 的 uid 建立索引