最近写到的功能,牵扯到批量查询,使用的一般的分页查询,步骤如下:
Integer pageSize = 3000;
1.先查询记录数
<select id="count" resultClass="long">
select count(*) from table_name where batch_no=#{batch_no}
</select>
2.获取记录数并使用在业务层做分页
Integer pageNum = count/pageSize;
if(count%pageSize !=0){ pageNum += 1; }
3.分页查询,注解传入 #startRow#,#pageSize#,#batch_no#三个参数,不同的数据库可以根于此三个参数属性应用不同的分页实现
<select id="page" resultClass="查询的实体类的全路径">
select * from table_name where batch_no=#{batch_no} order by id limit #{startRow},#{pageSize}
</select>
发现这样的分页查询是在100w的数据以内查询的时候,速度还是刚刚的,但是当数据量上升到200万甚至1000-2000万,查询的速度竟然是十几秒一页数据;
于是为了优化数据查询速度,就第三步要改了一下,
3.for循环外边定义一个qryId,默认为0
遍历第一页传入0,
for循环正序查询结束,将最后的数据的id赋值给qryId,
注解传入 #qryId#,#pageSize#,#batch_no#三个参数
并且修改一下sql;
select * from table_name where batch_no=#{batch_no} and id > #{qryId} order by id limit #{pageSize}
注意:
1.此处传递的id是正序查询上一页的数据的最后一条数据的id,如果是倒序分页就自己改一下吧;
2.一定要有索引哦,id主键索引,batch_no,id 索引