一张主表了, 6 个字表,主表和字表的关系都是多对一的查询优化问题

2022-05-16 22:04:31 +08:00
 qwzhang01

一张主表了,6 个字表,主表和字表的关系都是一对多 查询主表的时候,要把所有子表信息都查出来,目前是先查主表,然后循环为每个主表查对应的字表 list ,再将 list 赋值给主表的 dto ,主表大概 300 万的数据量,单个子表 1200 万的数据 目前查询比较慢,好的优化思路是什么呢

1819 次点击
所在节点    MySQL
6 条回复
RedBeanIce
2022-05-17 08:38:17 +08:00
来点代码
nothingistrue
2022-05-17 09:22:22 +08:00
要么归档历史数据减小数据量,要么在业务逻辑上拆能 7 个主表。这么大的数据量,你优化也最多 10 小时变半小时的程度,都不会满足实时查询。
dqzcwxb
2022-05-17 09:34:22 +08:00
第一步串行改并行,先查主表然后并行查子表
第二步优化短板,将子表查询耗时倒序一个个优化
第三步适当建立缓存,可以是持久层缓存也可以是业务层函数缓存甚至接口缓存都可以业务不允许则不使用缓存,请自行判断
cheng6563
2022-05-17 09:51:47 +08:00
子表能缓存的话,带上缓存串行改并行就行了。
不能缓存直接 join 吧让数据库自己优化去。
RedBeanIce
2022-05-17 09:56:44 +08:00
然后循环为每个主表查对应的字表 list ,再看看数据量

理论上可以,将主表的数据查出来,比如查出 200 条主表数据。(一次性查太多主表数据会导致主表和子表数据大对象)
然后直接获取主表的 idlist
将 idlist 同时查多个子表,获取子表的所有数据
最后等所有子表数据返回,塞到主表 list 里面去。
over

严禁循环查库
potatowish
2022-05-17 12:52:24 +08:00
1.并行查子表
2.查子表关联主表去查,不要循环查库

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

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

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

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

© 2021 V2EX