mysql 随机取几万数据_原!!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 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;*/

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值