小弟这里有一个SQL查询非常慢,大佬看一下有没有什么办法能优化一下?
各个表的数据量分别为
ic_file_proc_state ps; 3700000
og_file_audit ps; 300000
ic_file_audit ps; 2800008
SELECT
ps.ic_file_nm,
ps.BIZ_LINE,
ps.DB_INSR_TM,
ps.state,
ps.cdr_count,
fa.cdr_count fa_cdr_count,
fa.ic_file_chg_intax fa_ic_file_chg_intax,
fa.tap_format fa_tap_format,
oa.rec_count oa_rec_count,
oa.chg_intax oa_chg_intax,
oa.tap_format oa_tap_format
FROM (SELECT
ps.ic_file_nm,
ps.BIZ_LINE,
ps.DB_INSR_TM,
ps.state,
ps.cdr_count
FROM ic_file_proc_state ps) ps
LEFT JOIN ic_file_audit fa
ON ps.ic_file_nm = fa.ic_file_nm
LEFT JOIN og_file_audit oa
ON ps.ic_file_nm = oa.OG_FILE_NM
WHERE ps.state IN (1, 2, 3, 4)
这种关联查询本来就慢 你把where条件放到ps里面,然后限制好 fa 和 oa 的表的数据条件啥的 保证在能得到正确的结果的前提下 oa 和fa的数据量最小
SELECT
ps.ic_file_nm,
ps.BIZ_LINE,
ps.DB_INSR_TM,
ps.state,
ps.cdr_count,
fa.cdr_count fa_cdr_count,
fa.ic_file_chg_intax fa_ic_file_chg_intax,
fa.tap_format fa_tap_format,
oa.rec_count oa_rec_count,
oa.chg_intax oa_chg_intax,
oa.tap_format oa_tap_format
FROM (SELECT
ps.ic_file_nm,
ps.BIZ_LINE,
ps.DB_INSR_TM,
ps.state,
ps.cdr_count
FROM ic_file_proc_state ps WHERE ps.state IN (1, 2, 3, 4)) ps
LEFT JOIN (select ic_file_nm,cdr_count,ic_file_chg_intax,tap_format from ic_file_audit) fa
ON ps.ic_file_nm = fa.ic_file_nm
LEFT JOIN (select OG_FILE_NM,rec_count,chg_intax,tap_format from og_file_audit) oa
ON ps.ic_file_nm = oa.OG_FILE_NM
你们2位说的这种方式我试过了,效果不是很大,应为这表中ic_file_proc_state状态为1234的就占了99%
第一步 ps.state IN (1, 2, 3, 4) 可以改成 BETWEEN 1 AND 4
第二步 设置索引
第三部 优化LEFT JOIN 关键词(参考优化语句如: select film_id, description from sakila.film order by title limit 50, 5;:成改SELECT film.film_id, film.description from sakila.film inner join(select film_id from sakila.film order by title liimit 50,5) as film usinig(film_id))
1.索引优化
2.业务分表
3.sql拆分成java逻辑实现
1.加索引
2.使用视图