1
akira 2023-09-11 09:14:30 +08:00
b 表先自己 group 呢
|
3
akira 2023-09-11 09:18:28 +08:00
根据你的描述,
现在我把 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 |
4
Rache1 2023-09-11 09:22:13 +08:00
贴 explain
|
5
kaiki OP |
6
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 |
7
chunworkhard 2023-09-11 09:33:24 +08:00
小菜鸡一枚
1. 直接 a 表冗余这个字段,b 表变化去更新 a 表,主要考虑更新频繁不频繁, 这样每次只需查 a 表即可。 2. 尝试 3 楼的方法 先 group by b 表 再通过 uid 关联,b 的 uid 建立索引 |
8
kaiki OP @glitterzhong 按照你的写法,确实快了几倍,从原来的拉几十倍变成拉十几倍了,感觉还有优化空间,可能确实是分表再关联这个做法有问题
|
9
RedBeanIce 2023-09-11 10:15:38 +08:00
GROUP_CONCAT 包裹的一个或者多个字段,,,最长 1024 ,望周知。
|
10
kaiki OP @RedBeanIce 这个可以改配置文件的,不过查出来的数据都是一些数字,也不会到这么长
|
11
28Sv0ngQfIE7Yloe 2023-09-11 10:39:10 +08:00
放 explain 结果被
表结构没有,索引怎么做的也没说,执行计划也不放,大家只能盲人摸象般的帮你分析,效率太低了 |
12
janwarlen 2023-09-11 10:45:31 +08:00
如果主表是 a ,表 b 的查询只是补充数据,完全可以拆分为两个操作执行吧?
|
13
RainCats 2023-09-11 17:03:44 +08:00
看起来是完全可以拆成两个单表查询
|