目前很多的业务场景中,需要统计 当前用户生日的所有数据,很多同学在写代码的时候喜欢使用 mysql中的 DATE_FORMAT(birthday,'%y%m') = DATE_FORMAT(now(),'%y%m') 来实现,一旦 数据量大了以后 会查询非常的慢,因为 函数会导致 索引失效。
我这边的实现方案是,通过穷举最近100年 当前日期的所有年份,代码如下:
private List<Date> getBirthDayParam(Date date){
List<Date> birthDayParams = new ArrayList<>();
for (int i = 100; i > 1; i--) {
birthDayParams.add(DateUtils.addYears(date,-i));
}
return birthDayParams;
}
然后通过mybatis 的 wrapper进行查询即可
new LambdaQueryWrapper<DemoUser>()
.in(DemoUser::getBirthday,getBirthDayParam(date)));
最终优化的结果从之前的10s优化到了 毫秒级别。
注意: 数据库的Birthday字段最好使用date类型