从数据库中分批取数据的两种方式

需求:

从数据库中取出一批数据,比如数据上限是20万,现在要对其进行处理,用多线程分批处理。

(数据所在表的主键id是递增的【分片数据库自定义的主键自增函数】)

难点:如何从数据库中分批读取数据,每批之间又无重复数据

思路1:

用分页查询的方式取

先查询出要处理的总数据量 count,然后假设每批要处理1000条,

int size = 1000;
        int threadNum = count / size + 1;

        for (int i = 0; i < threadNum; i++) {
            Map paramMap = new HashMap();
            //分批查询
            paramMap.put("PAGE_INDEX", i*size);
            paramMap.put("PAGE_SIZE", size);
            //用 paramMap 去分页查询数据库
        }

【好处是:每一批数据基本都是数量相同的(除了最后一批)。

缺点是:

需要计算分页,查询时还要排序,同时在整个取数据的过程中:

1、不能对每批获取数据时的条件字段进行更新操作

2、不能对数据记录进行删除、增加操作】

思路2:

用取模的方式取数据

int size = 1000;
        int threadNum = count / size + 1;

        for (int i = 0; i < threadNum; i++) {
            Map paramMap = new HashMap();
            //分批查询
            paramMap.put("threadNum", threadNum);
            paramMap.put("mod", i);
            //用 paramMap 去取模查询数据库//  SELECT * FROM `tableName` WHERE id % threadNum = mod ; 即查询条件为 自增主键除以线程数余数为当前遍历到的 i
        }

【好处是:

查询时无需分页、排序所以速度快,

在整个取数据过程中,

1、在一定程度上可以对每批查询条件字段进行更新;

2、可以对数据记录进行删除操作

缺点是:主键必须相对连续、每批数据数量可能有很大误差(如果主键不完全连续,比如做过删除操作,或者查询条件不同)】

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红目香薰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值