想了几种方法:

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万以内的数据的更多相关文章

  1. laravel如何从mysql数据库中随机抽取n条数据

    laravel如何从mysql数据库中随机抽取n条数据 一.总结 一句话总结: inRandomOrder():$userQuestions=UserQuestion::where($map)-> ...

  2. 从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接)

    从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接) 一.总结 一句话总结:最好的是这个:"SELECT * FROM table WHERE id >= (( ...

  3. TODO:从数据库中随机抽取一条记录

    TODO:从数据库中随机抽取一条记录 1.最直接,最粗暴的方法先计算记录的总数,然后选择一个从0到记录总数之间的随机数n,利用skip跳过n条记录,这是效率低下的的方法,首先的记录总数,在用skip会 ...

  4. PHP中如何在数组中随机抽取n个数据的值 - array_rand()?

    PHP中如何在数组中随机抽取n个数据的值? 最佳答案 array_rand() 在你想从数组中取出一个或多个随机的单元时相当有用.它接受 input 作为输入数组和一个可选的参数 num_req,指明 ...

  5. 数据的随机抽取 及 jQuery补充效果(菜单、移动)

    一.数据的随机抽取 都见过那种考试题从很多题中随机抽取几道的试卷吧,现在就要做这样的一个例子:从数据库中随机抽取几条数据出来显示(例如:一百中随机挑选50条) 随机挑选是要有提交数据的,所以肯定是要有 ...

  6. 随手小代码——Python 从集合中随机抽取元素

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  7. 【转】从一副扑克牌中随机抽取N张

    该问题为产生不重复的随机数序列,形象点就是一副扑克牌中随机抽取N张. 摘自:不重复随机数列生成算法 改了一部分 /** * 从0-max随机选N个数出来 * **/ public static int ...

  8. mysql 多条数据中,分组获取值最大的数据记录

    摘要: 多条纪录中,几个字段相同,但是其中一个或者多个字段不同,则去该字段最大(这里只有一个不同) 源数据: 目的是移除:在同一天中只能存在一天数据,则取审核日期最大,数据库脚本如下: SELECT ...

  9. 关于批量插入数据之我见(100万级别的数据,mysql)

    因前段时间去面试,问到怎样高效向数据库插入10万条记录,之前没处理过类似问题.也没看过相关资料,结果没答上来,今天就查了些资料.总结出三种方法: 測试数据库为mysql!!! 方法一: public ...

随机推荐

  1. python字符串操作,以及对应的C#实现

    --IndexOf-- python: inx = str.find("aa") c#: var inx = str.IndexOf("aa"); --Last ...

  2. FPGA开发流程1(详述每一环节的物理含义和实现目标)

    要知道,要把一件事情做好,不管是做哪们技术还是办什么手续,明白这个事情的流程非常关键,它决定了这件事情的顺利进行与否.同样,我们学习FPGA开发数字系统这个技术,先撇开使用这个技术的基础编程语言的具体 ...

  3. Spring事务的隔离级别

    1.  ISOLATION_DEFAULT: 这是一个 PlatfromTransactionManager  默认的隔离级别,使用数据库默认的事务隔离级别. 另外四个与 JDBC的隔离级别相对应: ...

  4. 0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚

    @Transactianal注解有一些属性,见Spring-Framework-Reference Table17.3 Transactional-settings @Transactional(pr ...

  5. mysql之mysql、mysql-devel、mysql-server

    一.引言 一直都没搞明白这三者之间的关系,于是决心查资料把这个问题搞明白,遂记录以便查阅.学习 二.关系 mysql-devel 开发用到的库以及包含文件mysql mysql 客户端mysql-se ...

  6. CCNA2.0笔记_TCP/IP概述

    主机到主机层(传输层) TCP与UDP UDP的特点 运行于 OSI 模型和 TCP/IP 模型的传输层 为应用程序提供网络层接入而无需为可靠性机制付出多余开销 属无连接协议 提供有限的错误检查 提供 ...

  7. iOS swift跑马灯滚动可以点击

    跑马灯,从右至左循环滚动显示信息,并且支持点击事件,使用swift4.0语法完成,更加简介,通用性强,布局部分全部使用snpkit 代码: // // HXQMarqueeView.swift // ...

  8. 机器学习算法( 七、AdaBoost元算法)

    一.概述 当做重要决定时,大家可能都会考虑吸取多个专家而不只是一个人的意见.机器学习处理问题时又何尝不是如此?这就是元算法(meta-algorithm)背后的思路.元算法是对其他算法进行组合的一种方 ...

  9. 通用采集器Modbus协议应用

    1.  功能码 通用采集器一般包含DI,DO,AI相关接口,对此类接口主要应用功能码01~06. 3类接口具体对应关系如下: 继电器定义,功能码01/05(01:读线圈,05写线圈) 序号       ...

  10. 房间WIFI信号不好怎么办?——无线路由桥接(WDS)

    背景 1.无线路由在客厅,房间的WIFI信号很差,只有1-2格,虽说是100M的网速,但是从客厅到房间要经过3道墙!电脑的无线接收功能一般都很一般,网速不好理所当然. 2.弄一根网线从客厅连接起来很傻 ...