一、背景
1.百万级数据库,数据量持续增加。每张数据表的字段数大于50(时间字段,分组字段,指标字段)
2.JDBCTemplate,java,mysql
二、问题描述
通过分析接口返回数据响应时间过长(通过某个分组字段搜索数据,响应时间长达30s)。
三、检查问题
检查代码,发现代码中运行了两句SQL语句,一句通过select
查询数据,一句通过select count(1)
来获取返回数据的总条数。
通过navicat查询语句对应的执行时间。
SELECT eventtime,smart_card_id,uevt_1000 FROM analytics_vhsession_user_event_info_day_201901 WHERE eventtime>='2019-01-01 00:00:00' AND eventtime<'2019-01-31 23:59:59' AND smart_card_id = '0382205801' ORDER BY eventtime asc LIMIT 0,1000
> OK
> 时间: 10.603s
SELECT count(1) FROM analytics_vhsession_user_event_info_day_201901 WHERE eventtime>='2019-01-01 00:00:00' AND eventtime<'2019-01-31 23:59:59' AND smart_card_id = '0382205801'
> OK
> 时间: 11.13s
同样耗时10s+,所以想办法从select count(1)
入手,减少SQL执行时间以达到减少响应时间的目的。
四、查询资料
通过查询资料,可以通过使用sql_calc_found_rows
和found_rows()
替代select count(1)
。
通过navicat查询语句对应的执行时间。