使用hibernate,通过query.setFirstResult(fist),query.setMaxResult()进行分页时,查询前面的几页速度很快(20w条记录,1秒内),但点击“最后一页”时,查询速度很慢(20w条记录,13秒以上)。一般情况下原因是全表扫描,且需要的记录在表尾(需要长时间扫描后才能得到)。
解决办法:避免全表扫描,把查询分两步:
一,使用原来的查询条件用hibernate只查询符合条件的记录的id(session.createQuery("select yourObj.id from yourObjectName yourObj where yourCondition")),把查询得到的id构造成一个串,如:String newCondition = " id in (900000,899999) ";
二,用newCondition作为新的查询条件进行正常的查询。排序等各种限制条件在第一步已经使用,第二步查询时不再需要。
即使数据量达到200w条也基本可以把查询时间控制在2秒以内,且首页和尾页需要的时间基本一样。