1、问题描述:生产环境后台管理查询司机钱包汇总列表及统计所有司机钱包收入和支出金额,不管是查询一天还是一个月的速度都比较慢,经常会超时,超过两分钟未响应结果
2、问题排查:通过排查发现查询时的两张表数据时间字段均是以日期为单位,而每张表中的数据都超过400万行,而且以每天接近2万条的数据增长,但是每张表中的时间区分度只有200多个不同的日期,导致查询时无法用到时间单列索引,最终全表扫描,导致查询十分缓慢
3、解决办法:根据查询条件以及两张表的join字段添加对应组合索引,
司机余额快照表添加日期和服务卡号的组合索引,日期在前,服务卡号在后,司机钱包汇总明细表添加服务卡号和日期的组合索引,服务卡号在前,日期在后,(由于每天服务卡号数量都有接近2万个,从而提升了索引区分度,最终查询时会用到组合索引)最终查询速度提升了接近二十倍,查询超时问题解决
PS:由于第一张表用的是时间字段,所以组合索引时间要放在前面,不然会导致索引失效
添加索引sql如下:
– table1 表添加索引
ALTER TABLE table1 ADD INDEX INDEX_DRIVER_NO_DATE
( driver_no
, statistics_date
);
– table2 表添加索引
ALTER TABLE table2 ADD INDEX INDEX_DAY_SERVICE_NO
( current_day
, owner_id
);