今日在公司负责统一各项目Jar包版本,我使用了PageHelper 5.1.11,在测试过程中发现对于查询结果集数量大的分页响应时间特别的长(匹配结果几十万)。
于是将版本回退到5.1.4时响应时间恢复。
比较了查询SQL,发现分页部分有变化:
查询速度较快时的SQL结尾部分:
) TMP_PAGE WHERE ROWNUM <= 15
) WHERE PAGEHELPER_ROW_ID > 0
查询速度变慢后的SQL结尾部分:
) TMP_PAGE)
WHERE PAGEHELPER_ROW_ID <= 15 AND PAGEHELPER_ROW_ID > 0
很显然可以发现,之前在查询内层就减少了结果集,之后是将内层结果集全部查询出来以后再筛选需要的记录数
这时我们的解决方法有两种:1.回退到5.1.4版本 2.从源码上想办法
我从git上获取源码,在查看语句变化的类时发现原来新版本解决了这个问题,提供了2个Dialect,一个是oracle,一个时oracle9i,这里的oracle9i其实就是使用了之前的分页逻辑。
后来看见源码的Changelog里也说到了:
另外,在添加dialect时也遇到了和PageHelper4不同的问题,PageHelper5的配置是在<plugin interceptor="com.github.pagehelper.PageInterceptor">中添加下列属性
<property name="helperDialect" value="oracle9i"/>
再测试,分页变快了