多表联查 Group by 优化

2022-05-18 11:35:42 +08:00
 wym7223645
请教一个问题

假设有如下表

家庭表:家庭住址,家庭所在的省、市、区县、乡镇、村,家庭人数 其他字段
家庭详细:是否有电视、是否有厕所、是否有田、水田、旱田、水田的亩数、旱田的亩数 其他字段
家庭成员:成员名称、性别、出生日期 等等
家庭成员教育经历:开始时间、结束时间、学历


家庭与家庭详细信息一对一

家庭与家庭成员一对多,一个家有多个成员

家庭成员与教育经历一对多,例如 小学、初中、高中、大学等等


现在有如下需求,查询 XX 县,家里有电视、家庭成员包括姓张的,上过初中的,最终以家庭为单位展示数据,按照家庭人数排序


伪 sql

select
家庭.*
from
家庭
left join 家庭详细 on 家庭 = 家庭详细
left join 家庭成员 on 家庭 = 家庭成员
left join 家庭成员教育经历 on 家庭成员教育经历 = 家庭成员
where
1=1
and 家庭.区县 = 'xxx'
and 家庭详细.电视 = 是
and 家庭成员.姓名 like '张%'
and 家庭成员教育经历.学历 = '初中'
group by 家庭.id
order by 家庭.家庭人数 desc


这个最终查出的数据大概有 5 万多,该加的索引都加了,现在这个 SQL 非常慢,count 一下 大概需要 20 多秒,

项目是 java 、mybatis Plus


请问该如何优化,已经没有思路了,最好能在代码逻辑或 sql 写法上进行优化
876 次点击
所在节点    程序员
2 条回复
MoYi123
2022-05-18 11:44:05 +08:00
贴一下 explain
damai0419
2022-05-18 11:49:59 +08:00
怎么建的索引,最好也贴一下。

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

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

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

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

© 2021 V2EX