V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wym7223645
V2EX  ›  程序员

多表联查 Group by 优化

  •  
  •   wym7223645 · 2022-05-18 11:35:42 +08:00 · 878 次点击
    这是一个创建于 921 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请教一个问题

    假设有如下表

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


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

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

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


    现在有如下需求,查询 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 写法上进行优化
    MoYi123
        1
    MoYi123  
       2022-05-18 11:44:05 +08:00
    贴一下 explain
    damai0419
        2
    damai0419  
       2022-05-18 11:49:59 +08:00
    怎么建的索引,最好也贴一下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1094 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 18:27 · PVG 02:27 · LAX 10:27 · JFK 13:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.