记录分批次查询的取巧方法

861 阅读1分钟

问题

遍历数据库,根据一定条件筛选,每次取1000条进行处理数据处理,处理过程可能改变条件值,无法直接使用limit index,size,会导致遗漏或者多处理某些数据,原先伪代码:

int startIndex = 0;
int limit = 1000;
select * from user where status = 1 order by id limit #{startIndex}, #{limit} 
// 设置查询出来的数据为2
set status = 2;
重复查询设置

解决方案

每次只取1000条,根据id排序后取最后一条的id然后下一次查询必须大于次id,伪代码如下:

int limit = 1000;
long minId = 0;
List<User> users = select * from user where status = 1 and id > #{minId} order by id limit #{limit} 
// 设置查询出来的数据为2
if(CollectionUtils.isEmpty(users) {
	return;
}
minId = users.get(users.size()-1).getId();
set status = 2;
重复查询设置