很久没来写博客了,现在心情好又开始写了。只想记录自己在真实项目中遇到到的各种各样的问题,也算是对自己工作经历的一种文字记忆。
问题的由来
今天上午刚进办公室,公司的测试人员就向我反馈了一个问题,说有个页面中的数据无法导出,正常情况应该是可以导出为excle文件的。刚拿到这个项目不久,对项目还不是太熟悉,于是先在本地测试了了一下那个页面中的导出功能,结果果然如此,点击了导出按钮半天没反应。结果ru
结果如上图所示,等待了有两三分钟还是没反应,于是就关掉网页,去后台进行断点调试。一直跟到断点消失掉之前执行的一个查询语句,后台有打印。如下
SELECT T.DY_ID,T.CH_ID,BC.CH_NAME,T.PROBLEM_DESC,BR.REGION_NAME,
(SELECT FILE_URL FROM BS_SUBSIDIARYFILE WHERE RELATION_ID =T.DY_ID AND MODULE_ID='DT_WORKING' LIMIT 1) FILE_URL,
(SELECT GROUP_CONCAT(FILE_ID) FROM BS_SUBSIDIARYFILE WHERE RELATION_ID =T.DY_ID AND MODULE_ID='DT_WORKING') FILE_IDS,
(SELECT STAFF_NAME FROM SU_STAFF WHERE STAFF_ID = T.STAFF_ID) STAFF_NAME,
CASE WHEN T.SEND_TYPE='0' THEN '正常' ELSE '异常' END SEND_TYPE_NAME,
CASE WHEN T.WORK_STATUS='A' THEN '未上报' ELSE '已上报' END WORK_STATUS_NAME,
T.INSERT_DATETIME, T.STAFF_DATETIME,T.PROBLEM_TYPE,BC.GUARDIAN_NAME,
(SELECT GROUP_CONCAT(type_name) FROM fx_systype WHERE DEL_FALG='A' AND FIND_IN_SET(type_id,T.PROBLEM_TYPE) AND type_level = 2) PROBLEM_TYPE_NAME,
CASE WHEN (T.LON <= BR.REGION_GPS_LON+0.1 OR T.LON >= BR.REGION_GPS_LON-0.1)
AND (T.LAT <= BR.REGION_GPS_LAT+0.1 OR T.LAT >= BR.REGION_GPS_LAT-0.1)
THEN '范围之内' ELSE '不在范围' END ADDS_FLAG
FROM DT_WORKING T ,BS_CHILDRENSINFO BC,BS_REGION BR WHERE T.CH_ID=BC.CH_ID
AND BC.CH_LIVE_ADDR= BR.REGION_ID
AND BC.CH_LIVE_ADDR LIKE '5201%'
ORDER BY T.WORK_STATUS ,INSERT_DATETIME DESC LIMIT 0,1000000;
问题分析
单独复制出来用工具执行花的时间为一分多钟如下图
执行时间为一分半钟,然后就开始找原因,为什么这条语句执行时这么慢?原因慢就是因为上图中标红的两个子查询导致的。去掉两个子查询的执行时间如下图,执行时间0.6秒。
解决方案
原因找到了,就好对症下药。那两条语句都是关联查询,关联条件为简单的where 。以前一位前辈跟我提过,关联查询的查询速度要比where快不知道多少倍。暂时也没其他办法,我就报着试试看的心态去修改那两条语句,改为关联查询,并且为单独查询,只要排序方式正确就可以了。结果如下:
执行结果为1.233秒,问题解决。