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

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

Scroll Down

数据分流查询

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

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

场景

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

代码

Java - Service

   /**
	* 数据分流查询
	* 
	* 十万级或百万级大表查询
	* 加有索引的情况下 如果要定位很多数据 还是比较麻烦的 
	* 但是 要是根据 一些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

List<Test> findListByCodes(String codes);

SQL- xml

<select id="findListByCodes" parameterType="java.util.List">
        SELECT * FROM test
        code in (${codes})
</select>