数据量过多,如何优化查询过慢问题?
本文正在参加「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表相关字段添加索引是否成功
使用explain查询执行计划,比较添加索引前后的执行计划
基于【查询类型从最好到最差依次是:system>const>eq_ref>ref>range>index>ALL,一般情况下,类型至少保证达到range级别,最好能达到ref级别】依据,优化查询类型
针对内连接、左连接分别建立视图性能比较
已添加索引:
内连接视图执行计划:
左连接视图执行计划:
生产环境:
linux(运行内存:16G)、Mariadb(5.5版本)
内连接视图执行时间为4.386s,数据条数为674708条
左连接视图执行时间为4.523s,数据条数为753680条
使用v_my_affairs(采用内连接)视图添加ORDER BY后执行时间为8.666s,记录条数为674708条:
对比添加ORDER BY前后:增加了4.28s,查询耗时增加了一倍
采用左连接视图添加order by后执行时间为8.430s,记录条数为753680条
对比添加 order by前后:增加了3.907s,查询耗时增加将近一倍,查询时间比内连接用时少
请求生产环境接口
性能优化前接口完成请求耗时1min48s,采用内连接视图性能优化后接口完成请求耗时7.54s
采用左连接视图性能优化后接口完成请求耗时7.35s
总结
使用内连接视图,会导致数据量缺漏,所以采用左连接视图+索引优先SQL查询