我想优化一下查询速度,找到了查询特别慢的地方
when st.cor_no = 2021 then
(select sum(e.amount)
from cz_lnpay2021.ba_bgt_info e
where e.agency_code = st.agency_code
and e.cor_bgt_doc_no = st.cor_bgt_doc_no
and e.mof_div_code = 210000000
and e.fiscal_year = 2021
and e.is_deleted != 1
and e.bill_type_id = 301
and e.biz_type_id in ('001', '002', '003', '004')
and e.amount > 0)
这里的2021换成2022都不会慢,总体内容大概如下
select st.agency_code,
st.agency_name,
st.cor_bgt_doc_no,
case
when st.cor_no = 2020 then
(select sum(e.amount)
from cz_lnpay2021.ba_bgt_info e
where e.agency_code = st.agency_code
and e.cor_bgt_doc_no = st.cor_bgt_doc_no
and e.mof_div_code = 210000000
and e.fiscal_year = 2020
and e.is_deleted != 1
and e.bill_type_id = 301
and e.biz_type_id in ('001', '002', '003', '004')
and e.amount > 0)
when st.cor_no = 2021 then
(select sum(e.amount)
from cz_lnpay2021.ba_bgt_info e
where e.agency_code = st.agency_code
and e.cor_bgt_doc_no = st.cor_bgt_doc_no
and e.mof_div_code = 210000000
and e.fiscal_year = 2021
and e.is_deleted != 1
and e.bill_type_id = 301
and e.biz_type_id in ('001', '002', '003', '004')
and e.amount > 0)
else
0
end as ysamt,
st.pro_name,
sum(st.CARRYOVERS_AMT),
sum(JZ)
from a st
group by st.agency_code,
st.agency_name,
st.cor_no,
st.cor_bgt_doc_no,
st.pro_name
这种情况我该怎么优化呢
WITH bgt_info AS (
SELECT
agency_code,
cor_bgt_doc_no,
fiscal_year,
SUM( amount ) AS amount
FROM
cz_lnpay2021.ba_bgt_info
WHERE
mof_div_code = 210000000
AND is_deleted != 1
AND bill_type_id = 301
AND biz_type_id IN ( '001', '002', '003', '004' )
AND amount > 0
GROUP BY
agency_code,
cor_bgt_doc_no,
fiscal_year
) SELECT
st.agency_code,
st.agency_name,
st.cor_bgt_doc_no,
COALESCE( bgt_info.amount, 0 ) AS ysamt,
st.pro_name,
SUM( st.CARRYOVERS_AMT ),
SUM( JZ )
FROM
a st LEFT JOIN bgt_info ON st.agency_code = bgt_info.agency_code
AND st.cor_bgt_doc_no = bgt_info.cor_bgt_doc_no
AND st.cor_no = bgt_info.fiscal_year
GROUP BY
st.agency_code,
st.agency_name,
st.cor_no,
st.cor_bgt_doc_no,
st.pro_name
1.查看慢查询日志确定已经执行完的慢查询
2.show processlist 查看正在执行的慢查询
下面我就介绍如何使用以及两者的使用场景:
针对查询速度慢的问题,可以采取以下几种措施来提升查询速度:
优化SQL语句本身:避免使用 * ,少用函数和 like,不用嵌套语句,将大SQL拆成小SQL等。建议参考参考资料中的博客进行详细了解。
建立索引、优化索引:可以通过explain关键字来查看是否使用了索引,是否存在全表扫描等现象。对于联合索引,应该按照最左前缀原则进行查询。对于范围查询,只能应用于索引中的范围列。还可以根据业务场景和数据分布情况,判断是否需要加冗余字段来提升查询速度。
优化数据库参数:需要专业的DBA进行处理,通过调整参数来优化数据库性能。
优化服务器:需要专业的运维或项目经理进行处理,通过优化硬件、网络等方面来提升服务器性能。
采用读写分离和主从复制:通过将写入操作和读取操作分离到不同的数据库服务器上,可以提升整体的并发处理能力和查询速度。
将查询结果缓存到Redis等缓存中:在查询结果被频繁请求时,可以将查询结果缓存到内存中,以提升查询速度。
建议结合具体的业务场景和数据分布情况,采取以上措施中的一部分或多部分来进行优化。在优化过程中,还需要注意不要一味追求性能,而忽略了系统的稳定性和安全性。