博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原!!mysql,几十万条数据中随机抽取1万以内的数据
阅读量:4312 次
发布时间:2019-06-06

本文共 3413 字,大约阅读时间需要 11 分钟。

想了几种方法:

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
getMsgList(QueryOpenMsgBean queryReq) { List
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
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
allIdsList = openMsgMapper.getMsgIdsList(queryReq); int allIdsSize = allIdsList.size(); if (allIdsSize > 0) { //随机抽取id List
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
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
exportList = new ArrayList<>(); if (randomSearchNum < listSize) { //随机抽取,再导出 Set
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;*/ }

 

转载于:https://www.cnblogs.com/wuyun-blog/p/8399932.html

你可能感兴趣的文章
TZC Intercommunication System
查看>>
HDU 4571 SPFA+DP
查看>>
centos 创建以日期为名的文件夹
查看>>
Java Timer触发定时器
查看>>
Page Object设计模式
查看>>
程序的基础知识
查看>>
在VIM中使用GDB调试 – 使用vimgdb
查看>>
python爬虫---从零开始(五)pyQuery库
查看>>
POJ2236(KB5-A)
查看>>
Centos MySQL数据库迁移详细步骤
查看>>
2初出茅庐--初级篇2.1
查看>>
新建 WinCE7.0 下的 Silverlight 工程
查看>>
腾讯的张小龙是一个怎样的人?
查看>>
jxl写入excel实现数据导出功能
查看>>
linux文件目录类命令|--cp指令
查看>>
.net MVC 404错误解决方法
查看>>
linux系统目录结构
查看>>
git
查看>>
btn按钮之间事件相互调用
查看>>
Entity Framework 4.3.1 级联删除
查看>>