数据分流查询
为什么会用到数据分流呢?
在十万、百万级大表中查询一些我们想要的数据,如果按照某条件获得一批数据,在有索引的情况下,查询速度也不容乐观
场景
在做数据导入时,需要匹配改公司下数据是否重复的验证,恰好导入数据有编号(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>