sql语句优化,查询10条数据花费十几秒

问题遇到的现象和发生背景

这个sql查询速度很慢,接近10s

问题相关代码,请勿粘贴截图
EXPLAIN SELECT
    y.city_name,
    y.employee_number,
    y.last_name
FROM
    sddp.report_month y
    INNER JOIN sddp.report l ON y.`year_month` = "202101" 
    AND l.`year` = "2021" 
    AND y.job_zhuanye = l.job_zhuanye 
    AND y.job_zhize = l.job_zhize 
    AND l.job_name = '公众线' 
    AND y.person_type_name = '正式' 
    AND y.city_id IN (
    SELECT
        o2.org
    FROM
        dhr.g_org o1
        INNER JOIN dhr.g_org o2 ON o2.leftnode >= o1.leftnode 
        AND o2.rightnode <= o1.rightnode 
    WHERE
        o1.org_id IN ( 2222 ) 
    ) 
    AND NOT EXISTS ( SELECT 1 FROM sddp.report_not d WHERE d.`year` = "2021" AND d.employee_number = y.employee_number ) UNION ALL
SELECT
    y.city_name,
    y.employee_number,
    y.last_name
FROM
    sddp.report_month y
    INNER JOIN sddp.report l ON y.`year_month` = "202101" 
    AND l.`year` = "2021" 
    AND y.job_zhuanye = l.job_zhuanye 
    AND l.job_name != '公众线' 
    AND y.person_type_name = '正式' 
    AND y.city_id IN (
    SELECT
        o2.org
    FROM
        dhr.g_org o1
        INNER JOIN dhr.g_org o2 ON o2.leftnode >= o1.leftnode 
        AND o2.rightnode <= o1.rightnode 
    WHERE
        o1.org_id IN ( 2222) 
    ) 
    AND NOT EXISTS ( SELECT 1 FROM sddp.report_not d WHERE d.`year` = "2021" AND d.employee_number = y.employee_number ) 
    LIMIT 0,10 
运行结果及报错内容

explain 结果

img


查看索引

img

1、除了楼上指出的不同外,UNION ALL 后一个 的 y.city_id IN ( SELECT …… dhr.g_orgn o1 ,这时的表名是 g_orgn 而不是 g_org,多一个n,考虑可能是输入错误
如果按输入错误算,如楼上所述,那整个UNION ALL的表达:前一个是带 AND y.job_zhize = l.job_zhize,而后一个不带,明显后一个查询的结果集包含前一个查询的结果集,UNION起来的意思是前一个查询的结果在结果集中会出现两份,不知道业务需求上是不是要这样输出……

2、如果 dhr.g_org 表的 org 字段上建立有索引的话,可以使用 EXISTS 代替 IN,可以利用该索引

把in 改成连接查询。
然后你union 的两个查询 只有这个条件
AND y.job_zhize = l.job_zhize 不一样 应该不用union all 感觉

o1.org_id IN ( 2222 )  这里是一个的话 改成等于

个人感觉你这个不光是优化查询效率的问题,想象不出你这个查询的场景是什么~~

select 
from 
sddp.report_month y,
sddp.report l
where 
y.year_month = '202101'
and l.year = '2021'
and y.job_zhuanye = l.job_zhuanye
and y.job_zhize = l.job_zhize 
and l.job_name = '公众线' 
and y.person_type_name = '正式'
and exists (select 1 from dhr.g_org o where y.city_id = o.org and o.org_id in (2222))
and not exists (select 1 from sddp.report_not d where d.employee_number = y.employee_number and d.year = '2021')
limit 0,10
;