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

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

需求:


从数据库中取出一批数据,比如数据上限是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、可以对数据记录进行删除操作


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


相关文章
|
4月前
|
消息中间件 存储 缓存
写入内容丢失,各种数据库或者存储系统如何处理?
写入内容丢失,各种数据库或者存储系统如何处理?
43 0
|
4月前
|
数据库
数据库第七次作业 更新数据
数据库第七次作业 更新数据
26 0
|
9月前
|
存储 前端开发 中间件
应用数据库常见的数据切分方式
应用数据库常见的数据切分方式
90 0
|
缓存 JSON NoSQL
如何处理缓存跟数据库数据不一致?
如何处理缓存跟数据库数据不一致?
如何处理缓存跟数据库数据不一致?
|
关系型数据库 MySQL 数据库
数据库同步功能要慎用
数据库同步功能要慎用
61 0
|
数据库
从数据库中分批取数据的两种方式
从数据库中分批取数据的两种方式
90 0
|
canal 缓存 关系型数据库
高并发先操作数据库,还是先操作缓存?5 个方案告诉你!
在分布式系统中,缓存和数据库同时存在时,如果有写操作的时候,先操作数据库还是先操作缓存呢? 先思考一下,可能会存在哪些问题,再往下看。下面我分几种方案阐述。
高并发先操作数据库,还是先操作缓存?5 个方案告诉你!
|
缓存 数据库
究竟先操作缓存,还是数据库?
缓存存储,也是数据的冗余。
603 0
|
关系型数据库 MySQL 数据库
不同数据库之间表数据的实时同步_syncnavigator数据库同步工具
SyncNavigator 做数据同步时所支持的数据库类型: 支持sqlserver 2000-2014所有版本,全兼容,和MYsql 4.x 、MYsql 5.x 、MYsql 6.x版本。 来源数据库和目标数据库可以版本不同,比如:来源数据库是sqlserver 2012 目标数据库是mysql 5.5 ,都是可以的, SyncNavigator 支持跨数据库版本,无缝传输数据。
5594 0