原!!mysql,几十万条数据中随机抽取1万以内的数据
想了几种方法:
1.将所有符合条件的对象集合都查出来,在代码里做随机。
2.先查出所有符合条件的id,再代码随机需要抽查数量的id,再 到数据库 中 in。
3.利用order by rand() limit ,随机出需要抽查数量的id,再到数据库中 in
条件过滤后,大概15万条数据,测试,第3种方法相对快,但是抽查数量到 7k, 8k, 1w 时候,第2种会稍微快点。
知乎上:https://www.zhihu.com/question/20151242 建议用第2种。
可能测试不够充分,待继续测试。。。
public List<OpenMsgDo> getMsgList(QueryOpenMsgBean queryReq) { List<OpenMsgDo> exportList = new ArrayList<>();
transform(queryReq);
int randomSearchNum = Integer.parseInt(queryReq.getRandomSearchNum()); log.info("查询的表名queryTableName=" + /*queryReq.getQueryTableName() + ", 符合查询条件的短信数量="
+ allIdsSize + */", 页面抽查的短信数量=" + randomSearchNum); //1.order by rand() limit 方式随机获取 id,再in
// long startTime2 = System.currentTimeMillis(); //开始测试时间
List<Integer> randomIdsList2 = openMsgMapper.getRandomMsgIdsList(queryReq);
if (randomIdsList2.size() > 0) {
exportList = openMsgMapper.getMsgListByIds(queryReq.getQueryTableName(),
randomIdsList2);
}
// long endTime2 = System.currentTimeMillis(); //获取结束时间
// System.out.println("【【rand id 再in 方式 获取短信集合耗时: " + (double)(endTime2 - startTime2) / 1000 + "s】】");
return exportList; /*
* 2.查出所有id,再随机id进去 ,in
* long startTime = System.currentTimeMillis(); //开始测试时间
List<Integer> allIdsList = openMsgMapper.getMsgIdsList(queryReq);
int allIdsSize = allIdsList.size();
if (allIdsSize > 0) {
//随机抽取id
List<Integer> randomIdsList = new ArrayList<>();
log.info("查询的表名queryTableName=" + queryReq.getQueryTableName() + ", 符合查询条件的短信数量="
+ allIdsSize + ", 页面抽查的短信数量=" + randomSearchNum);
int max = allIdsSize;
if (randomSearchNum < allIdsSize) {
//随机抽取,再导出
for (int i = 0; i < randomSearchNum; i++) {
int num = random.nextInt(max - i);//[0,max-i)
randomIdsList.add(allIdsList.get(num));
allIdsList.remove(num); //获得后去除,防止重复
}
log.info("实际随机抽取的短信数量=" + randomIdsList.size());
} else {
randomIdsList = allIdsList;
}
exportList = openMsgMapper.getMsgListByIds(queryReq.getQueryTableName(), randomIdsList);
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("【【获取所有id,随机抽取,再in 方式 获取短信集合耗时: " + (double)(endTime - startTime)/1000 + "s】】");
}*/ /*
* 3.短信集合都查出来,再随机
* transform(queryReq);
List<OpenMsgDo> list = openMsgMapper.getMsgList(queryReq);
int listSize = list.size();
int randomSearchNum = Integer.parseInt(queryReq.getRandomSearchNum());
log.info("查询的表名queryTableName=" + queryReq.getQueryTableName() + ", 符合查询条件的短信数量=" + listSize
+ ", 页面抽查的短信数量=" + randomSearchNum); int max = listSize;
List<OpenMsgDo> exportList = new ArrayList<>();
if (randomSearchNum < listSize) {
//随机抽取,再导出
Set<OpenMsgDo> set = new TreeSet<>();
for (int i = 0; i < randomSearchNum; i++) {
int num = random.nextInt(max - i);//[0,max-i)
set.add(list.get(num));
list.remove(num); //获得后去除,防止重复
}
log.info("实际随机抽取的短信数量=" + set.size());
exportList.addAll(set);
} else {
exportList = list;
} return exportList;*/
}
原!!mysql,几十万条数据中随机抽取1万以内的数据的更多相关文章
- laravel如何从mysql数据库中随机抽取n条数据
laravel如何从mysql数据库中随机抽取n条数据 一.总结 一句话总结: inRandomOrder():$userQuestions=UserQuestion::where($map)-> ...
- 从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接)
从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接) 一.总结 一句话总结:最好的是这个:"SELECT * FROM table WHERE id >= (( ...
- TODO:从数据库中随机抽取一条记录
TODO:从数据库中随机抽取一条记录 1.最直接,最粗暴的方法先计算记录的总数,然后选择一个从0到记录总数之间的随机数n,利用skip跳过n条记录,这是效率低下的的方法,首先的记录总数,在用skip会 ...
- PHP中如何在数组中随机抽取n个数据的值 - array_rand()?
PHP中如何在数组中随机抽取n个数据的值? 最佳答案 array_rand() 在你想从数组中取出一个或多个随机的单元时相当有用.它接受 input 作为输入数组和一个可选的参数 num_req,指明 ...
- 数据的随机抽取 及 jQuery补充效果(菜单、移动)
一.数据的随机抽取 都见过那种考试题从很多题中随机抽取几道的试卷吧,现在就要做这样的一个例子:从数据库中随机抽取几条数据出来显示(例如:一百中随机挑选50条) 随机挑选是要有提交数据的,所以肯定是要有 ...
- 随手小代码——Python 从集合中随机抽取元素
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- 【转】从一副扑克牌中随机抽取N张
该问题为产生不重复的随机数序列,形象点就是一副扑克牌中随机抽取N张. 摘自:不重复随机数列生成算法 改了一部分 /** * 从0-max随机选N个数出来 * **/ public static int ...
- mysql 多条数据中,分组获取值最大的数据记录
摘要: 多条纪录中,几个字段相同,但是其中一个或者多个字段不同,则去该字段最大(这里只有一个不同) 源数据: 目的是移除:在同一天中只能存在一天数据,则取审核日期最大,数据库脚本如下: SELECT ...
- 关于批量插入数据之我见(100万级别的数据,mysql)
因前段时间去面试,问到怎样高效向数据库插入10万条记录,之前没处理过类似问题.也没看过相关资料,结果没答上来,今天就查了些资料.总结出三种方法: 測试数据库为mysql!!! 方法一: public ...
随机推荐
- mybatis-config.xml文件详解
1. 属性列表 Mybatis的配置文件中包含了影响mybatis行为的设置(settings)和属性(properties)信息.文档的顶层结构如下: ·configuration 根配置 ·pro ...
- Atitit.使用引擎加脚本架构的设计 使用php,js来开发桌面程序。。
Atitit.使用引擎加脚本架构的设计 使用php,js来开发桌面程序.. 1. 引擎加脚本架构 跨平台,桌面与web的优势1 2. 架构桌面引擎(java,c#)2 3. php桌面引擎要点2 3. ...
- C语言第十一回合:预处理命令的集中营
C语言第十一回合:预处理命令的集中营 [学习目标] 1. 宏定义 2. 文件包括"处理 3. 条件编译 预处理命令:能够改进程序设计的 ...
- 655. Big Integer Addition【easy】
Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2 ...
- python学习笔记1--python简介
Python翻译中文是蟒蛇.发明人guido喜欢蟒蛇马戏团,故起名python. python发展简史: --CNRI时期.CNRI资助Python发展的重要单位,python1.5版之前的成果大部分 ...
- ExtGridReturn ,存放ext的实体类集合和总数
package cn.edu.hbcf.common.vo; import java.util.List; /** * Ext Grid返回对象 * * @author * */ public cla ...
- Django - 安装Ckeditor
1. Ckedior.js CKEDITOR.editorConfig = function( config ) { // config.filebrowserUploadUrl="/blo ...
- cobbler 修改 distro_signatures.json
edit file in /var/lib/cobbler/distro_signatures.json and restart cobblerd service 转自: https://lists. ...
- bash脚本IFS=',' read的意思
IFS is the Input Field Separator, which means the string read will be split based on the characters ...
- ubuntu 安装 avahi服务
sudo apt-get install avahi-daemon sudo apt-get install avahi-utils