前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从数据库中分批取数据的两种方式

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

作者头像
红目香薰
发布2022-11-29 18:25:29
8760
发布2022-11-29 18:25:29
举报
文章被收录于专栏:CSDNToQQCode

需求:

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

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

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

思路1:

用分页查询的方式取

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

代码语言:javascript
复制
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:

用取模的方式取数据

代码语言:javascript
复制
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、可以对数据记录进行删除操作

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档