今天在写接口时发现查询当天数据当导致索引失效,引起全表查询
<!-- 例:以下两种写法均会导致索引失效 -->
SELECT
*
FROM
`order`
WHERE
TO_DAYS(order_time) = TO_DAYS(NOW())
<!--orderTime: '2020-05-19 09:30:00' Date类型-->
SELECT
*
FROM
`order`
WHERE
order_time,
'%Y-%m-%d'
) = DATE_FORMAT(
#{orderTime},
'%Y-%m-%d'
)
解决方法 使用between and
<!--stime:'2020-05-19 00:00:00' Date类型-->
<!--etime:'2020-05-19 23:59:00' Date类型-->
SELECT
*
FROM
`order`
WHERE
order_time between #{stime} and #{etime}
/**
* 设置当天起始时间
*/
public Date getTodayStart() {
Calendar todayStart = Calendar.getInstance();
todayStart.set(Calendar.HOUR_OF_DAY, 0);
todayStart.set(Calendar.MINUTE, 0);
todayStart.set(Calendar.SECOND, 0);
todayStart.set(Calendar.MILLISECOND, 0);
Date start = todayStart.getTime();
return start;
}
/**
* 设置当天结束时间
*/
public Date getTodayEnd() {
Calendar todayStart = Calendar.getInstance();
todayStart.set(Calendar.HOUR_OF_DAY, 23);
todayStart.set(Calendar.MINUTE, 59);
todayStart.set(Calendar.SECOND, 0);
todayStart.set(Calendar.MILLISECOND, 0);
Date end = todayStart.getTime();
return end;
}