一张主表了,6 个字表,主表和字表的关系都是一对多 查询主表的时候,要把所有子表信息都查出来,目前是先查主表,然后循环为每个主表查对应的字表 list ,再将 list 赋值给主表的 dto ,主表大概 300 万的数据量,单个子表 1200 万的数据 目前查询比较慢,好的优化思路是什么呢
1
RedBeanIce 2022-05-17 08:38:17 +08:00 via iPhone
来点代码
|
2
nothingistrue 2022-05-17 09:22:22 +08:00
要么归档历史数据减小数据量,要么在业务逻辑上拆能 7 个主表。这么大的数据量,你优化也最多 10 小时变半小时的程度,都不会满足实时查询。
|
3
dqzcwxb 2022-05-17 09:34:22 +08:00
第一步串行改并行,先查主表然后并行查子表
第二步优化短板,将子表查询耗时倒序一个个优化 第三步适当建立缓存,可以是持久层缓存也可以是业务层函数缓存甚至接口缓存都可以业务不允许则不使用缓存,请自行判断 |
4
cheng6563 2022-05-17 09:51:47 +08:00
子表能缓存的话,带上缓存串行改并行就行了。
不能缓存直接 join 吧让数据库自己优化去。 |
5
RedBeanIce 2022-05-17 09:56:44 +08:00
然后循环为每个主表查对应的字表 list ,再看看数据量
理论上可以,将主表的数据查出来,比如查出 200 条主表数据。(一次性查太多主表数据会导致主表和子表数据大对象) 然后直接获取主表的 idlist 将 idlist 同时查多个子表,获取子表的所有数据 最后等所有子表数据返回,塞到主表 list 里面去。 over 严禁循环查库 |
6
potatowish 2022-05-17 12:52:24 +08:00 via iPhone
1.并行查子表
2.查子表关联主表去查,不要循环查库 |