想了几种方法:

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. 多线程-Thread与Runnable源码分析

    Runnable: @FunctionalInterface public interface Runnable { /** * When an object implementing interfa ...

  2. PHPCMS V9数据库表结构分析

    PHPCMS V9可以轻松承载百万级的访问数据,最大的功臣就是PHPCMS良好的数据库结构,在数据库的设计方面,一定是下足了功夫.   一般网站的信息量离这个级别相差甚远,但是了解学习一下PHPCMS ...

  3. 李洪强iOS经典面试题30-一个区分度很大的面试题

    李洪强iOS经典面试题30-一个区分度很大的面试题 考察一个面试者基础咋样,基本上问一个 @property 就够了: @property 后面可以有哪些修饰符? 线程安全的: atomic,nona ...

  4. java -jar命令

    1.用eclipse的export导出jar包后,打开jar中的MANIFEST.MS文件,修改如下: 2.然后在命令行中输入命令:java -jar aa.jar即可.

  5. 获取真实的IE版本(转)

    IE 的浏览器模式和文本模式(二) 发表于 2013-09-07 Author: Jerry Qu 文章目录 判断真正的 IE 版本 JScript 引擎版本号 文本模式对 JScript 没影响? ...

  6. PHP——菜单及内容轮换(Jquery)

    效果: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...

  7. java.lang.IllegalArgumentException: SessionContext must be an HTTP compatible implementation.:模块化本地测试shiro的一些总结

    项目由于是多模块的,所以,测试的时候我想现将shiro框架进行本地测试,然后再放入框架里面,但是这个困扰我了两天了都,其实我应该想到的,只是想多试试,最后还不如多想想 先说一下系统的基本情况,项目是多 ...

  8. JQ Ajax 上传文件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 富文本编辑期Quill

    官方网站http://quilljs.com/ 使用方法 <!-- Create the toolbar container --> <div id="toolbar&qu ...

  10. phpstorm 内存设置

    https://blog.csdn.net/qq_33862644/article/details/81938970