数据量过多,如何优化查询过慢问题?| Java Debug 笔记

数据量过多,如何优化查询过慢问题?

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看 掘力计划 Java 主题月 – Java Debug笔记

业务场景:

t_ql_case为主表,表数据量有792699条(79万),t_sx_service表为副表,表数据量为82651条(8万),t_sys_organ表为副表,表数据量有364条

性能问题

pagehleper分页工具查询速度过慢,单单SQL查询耗时为120秒

针对这个性能问题采用视图+索引解决方案来优化SQL查询

最初SQL查询使用内连接查询

SELECT
	`c`.`CASE_OID` AS `CASE_OID`,
	`c`.`CASE_NUMBER` AS `CASE_NUMBER`,
	`c`.`APPLY_PROJECT_NAME` AS `APPLY_PROJECT_NAME`,
	`c`.`APPLY_USER_NAME` AS `APPLY_USER_NAME`,
	`c`.`CASE_STATUS` AS `CASE_STATUS`,
	`c`.`APPLY_USER_TYPE` AS `APPLY_USER_TYPE`,
	`c`.`CREDENTIAL_NUMBER` AS `CREDENTIAL_NUMBER`,
	`c`.`ACCEPTANCE_DATE` AS `ACCEPTANCE_DATE`,
	`o`.`CODE` AS `CODE`,
	`o`.`NAME` AS `NAME`
FROM
	(
		(
			`t_ql_case` `c`
			JOIN `t_sx_service` `s`
		)
		JOIN `t_sys_organ` `o`
	)
WHERE
	(
		(
			`c`.`SERVICE_OID` = `s`.`SERVICE_OID`
		)
		AND (`c`.`ORGAN_OID` = `o`.`OID`)
		AND (`c`.`DEL_FLAG` = 'N')
	)
复制代码

修改为左连接查询并把三表联合查询设计成视图v_my_affairs

SELECT
	`c`.`CASE_OID` AS `CASE_OID`,
	`c`.`CASE_NUMBER` AS `CASE_NUMBER`,
	`c`.`APPLY_PROJECT_NAME` AS `APPLY_PROJECT_NAME`,
	`c`.`APPLY_USER_NAME` AS `APPLY_USER_NAME`,
	`c`.`CASE_STATUS` AS `CASE_STATUS`,
	`c`.`APPLY_USER_TYPE` AS `APPLY_USER_TYPE`,
	`c`.`CREDENTIAL_NUMBER` AS `CREDENTIAL_NUMBER`,
	`c`.`ACCEPTANCE_DATE` AS `ACCEPTANCE_DATE`,
	`o`.`CODE` AS `CODE`,
	`o`.`NAME` AS `NAME`
FROM
	t_ql_case c
LEFT JOIN t_sx_service s ON c.SERVICE_OID = s.SERVICE_OID
LEFT JOIN t_sys_organ o ON c.ORGAN_OID = o.OID
WHERE
	c.DEL_FLAG = 'N'
        
 备注:OID、SERVICE_OID已有主键索引
复制代码

将三个表查询条件添加普通索引

alter table t_ql_case  add INDEX DEL_FLAG(DEL_FLAG);
alter table t_ql_case  add INDEX ORGAN_OID(ORGAN_OID);
alter table t_ql_case  add INDEX SERVICE_OID(SERVICE_OID);
复制代码

查询t_ql_case表相关字段添加索引是否成功

1.png

使用explain查询执行计划,比较添加索引前后的执行计划

基于【查询类型从最好到最差依次是:system>const>eq_ref>ref>range>index>ALL,一般情况下,类型至少保证达到range级别,最好能达到ref级别】依据,优化查询类型

2.png

针对内连接、左连接分别建立视图性能比较

已添加索引:

内连接视图执行计划:

3.png

左连接视图执行计划:

4.png

生产环境:

linux(运行内存:16G)、Mariadb(5.5版本)

内连接视图执行时间为4.386s,数据条数为674708条

5.png

左连接视图执行时间为4.523s,数据条数为753680条

6.png

使用v_my_affairs(采用内连接)视图添加ORDER BY后执行时间为8.666s,记录条数为674708条:

7.png
对比添加ORDER BY前后:增加了4.28s,查询耗时增加了一倍

采用左连接视图添加order by后执行时间为8.430s,记录条数为753680条

8.png
对比添加 order by前后:增加了3.907s,查询耗时增加将近一倍,查询时间比内连接用时少

请求生产环境接口

性能优化前接口完成请求耗时1min48s,采用内连接视图性能优化后接口完成请求耗时7.54s

9.png

采用左连接视图性能优化后接口完成请求耗时7.35s

10.png

总结

使用内连接视图,会导致数据量缺漏,所以采用左连接视图+索引优先SQL查询

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享