前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >百万数据,SQL数据分流查询

百万数据,SQL数据分流查询

作者头像
Parker
发布2020-07-21 18:09:54
1.2K0
发布2020-07-21 18:09:54
举报
文章被收录于专栏:在码圈在码圈

数据分流查询

为什么会用到数据分流呢?

在十万、百万级大表中查询一些我们想要的数据,如果按照某条件获得一批数据,在有索引的情况下,查询速度也不容乐观

场景

在做数据导入时,需要匹配改公司下数据是否重复的验证,恰好导入数据有编号(code)这个字段,则可以采取code分批次索引查询,这样会大大提高查询速度

代码

Java - Service

代码语言:javascript
复制
   /**
	* 数据分流查询
	* 
	* 十万级或百万级大表查询
	* 加有索引的情况下 如果要定位很多数据 还是比较麻烦的 
	* 但是 要是根据 一些Code 批量获得数据 可以采取以下分流方案	
	**/
    public List<Test> contractShunt(List<String> codes){

        List<Test> datas = new ArrayList<>();

        if(listSave.size() > 0){
            int size = listSave.size();
			// 500 个code 为一个批次
            int cyclesNum = 500;
            int num;
            int remainder = size%cyclesNum;
            if(size != 0) {
                num = (int)size/cyclesNum;
                if (size < cyclesNum) {
                    num += 1;
                } else {
                    if(remainder != 0) num += 1;
                }
                int count = 0;
                int listSize = cyclesNum;
                if(num == 1){//数据单分组

                    List<String> codesTemp = new ArrayList<>();

                    for (String code : codes) {
                        if(null != code && !"".equals(code.trim())){
                            codesTemp.add("'"+code+"'");
                        }
                    }

					// 数据库查询SQL
                    datas = testService.findListByCodes(StringUtils.strip(codes.toString(),"[]"));

                    return removeDuplicate(datas);

                }else if(num > 1){//数据多分组
                    for(int i =1;i<=num;i++){
                        List<CmSubjectBalance> saves = new ArrayList<>();
                        for(int k = count;k<listSize;k++){
                            saves.add(listSave.get(k));
                        }

                        List<String> codesTemp = new ArrayList<>();

						for (String code : saves) {
							if(null != code && !"".equals(code.trim())){
								codesTemp.add("'"+code+"'");
							}
						}

						// 数据库查询SQL
                        List<Test> datasTemp = testService.findListByCodes(StringUtils.strip(codes.toString(),"[]"));

                        for (Test testT : datasTemp) {
                            datas.add(testT);
                        }

                        count = listSize;
                        if(i == num-1){
                            // 如果 余数为0 则是 基数的倍数
                            if(remainder == 0){
                                listSize += cyclesNum;
                            }else{
                                listSize += remainder;
                            }
                        }else {
                            listSize += cyclesNum;
                        }
                    }

                    return removeDuplicate(datas);
                }
            }
        }

        return datas;
    }

    //List 去重复
    public static List removeDuplicate(List list) {
        HashSet h = new HashSet(list);
        list.clear();
        list.addAll(h);
        return list;
    }

Java - Mapper

代码语言:javascript
复制
List<Test> findListByCodes(String codes);

SQL- xml

代码语言:javascript
复制
<select id="findListByCodes" parameterType="java.util.List">
        SELECT * FROM test
        code in (${codes})
</select>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据分流查询
  • 场景
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档