原!!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 ...
随机推荐
- Atitit.jpg png格式差别以及解决jpg图片不显示的问题
Atitit.模板引擎原理以及常见模板技术 1. Asp Php jsp smarty模板1 1.1. 模板引擎基本原理1 1.2. 调试模式原理2 2. Attilax总结的模板引擎原理2 3. 支 ...
- poj 1806 Frequent values(RMQ 统计次数) 详细讲解
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1806 题目大意:给你一个非降序排列的整数数组,你的任务是对于一系列的询问,(i,j),回答序列中出现次 ...
- unix基础杂谈
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- linux内核开机logo显示调试
要使内核支持开机logo显示需要配置内核 配置如下: make menuconfig: Device Drivers ---> Graphics support ---> ...
- 从git中更新本地需要填写的正则
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_FILENA ...
- 【转】MYSQL 存储过程定时操作数据库
这个涉及2个步骤,第一个就是建立存储过程: create procedure clear_table() begin drop database XXX end 第二步就是让其定时运行: 查看even ...
- 逃不掉的mysql数据库安装方式大全yum rpm 源码
数据库虽然也不是天天安装,但每次安装都要找来找去挺烦,特整理记录在此. 系统基于:Centos 7.x 数据库版本: MySQL 5.7.x 转载请注明出处 Yum 安装方式 1.下载 yum rep ...
- 补图BFS(hdu 5876)
题目大意: 给出一个图和起点S,求补图中S到其他点的最短距离. http://acm.hdu.edu.cn/showproblem.php?pid=5876 我自己的垃圾做法: 用线段树来维护dijk ...
- ObjectTools反射实例
ObjectTools反射实例 package com.shitou.deposit.chinapnr.utils; import org.apache.commons.logging.Log; im ...
- push certificate
developer_identity.cer <= download from Applemykey.p12 <= Your private key openssl x509 -in de ...