这个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 结果
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
;