百万数据,SQL数据分流查询
时间:2022-07-22
本文章向大家介绍百万数据,SQL数据分流查询,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
数据分流查询
为什么会用到数据分流呢?
在十万、百万级大表中查询一些我们想要的数据,如果按照某条件获得一批数据,在有索引的情况下,查询速度也不容乐观
场景
在做数据导入时,需要匹配改公司下数据是否重复的验证,恰好导入数据有编号(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>
- 解决 wcf HTTP 无法注册 另一应用程序正在使用 TCP 端口 80
- 构建Flink工程及demo演示
- F-Stack之kqueue封装为epoll介绍
- wcf http 返回图片
- F-Stack与Seastar对比
- Flink DataStream编程指南及使用注意事项。
- sqlserver 行转列
- FreeBSD下的工具(sysctl、netstat等)如何移植到F-Stack
- java面试基础知识(一)
- Linq 实现 DataTable 行转列
- sql常用的系统存储过程
- 用DPDK rte_ring实现多进程间通信
- sqlserver 的事务和c#的事务
- Flink DataStream编程指南
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android编程实现禁止StatusBar下拉的方法
- Android自定义view圆并随手指移动
- Android仿微信发送语音消息的功能及示例代码
- 详解Android studio ndk配置cmake开发native C
- Android编程实现禁止状态栏下拉的方法详解
- Android进度条ProgressBar的实现代码
- Android画画板的制作方法
- Android实现bitmap指定区域滑动截取功能
- Android开发实现应用层面屏蔽状态栏的方法小结
- Android实现实时搜索框功能
- 浅谈Android轻量级的数据缓存框架RxCache
- Android开发实现消除屏幕锁的方法
- Android中js和原生交互的示例代码
- 浅谈android获取设备唯一标识完美解决方案
- Android开发实现长按返回键弹出关机框功能