57,064
社区成员
发帖
与我相关
我的任务
分享




啊啊啊啊啊啊 好尴尬呀,之前说的很慢的几种方法都是因为没有把日志等级调好,控制台在疯狂输出日志造成的时间浪费啊
谢谢大家啦CREATE TABLE `test` (
`sss` varchar(20) NOT NULL,
PRIMARY KEY (`sss`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
生成100W数据
CREATE PROCEDURE `aa`()
BEGIN
DECLARE i int;
DECLARE c int;
set i = 0;
set autocommit = 0;
while i < 1000 do
set c = 0;
while c < 1000 do
insert into test VALUES( LPAD(i*1000+c,10,'0'));
set c=c+1;
end while;
commit;
set i=i+1;
end while;
set autocommit = 1;
END
查询
select * from test WHERE sss > '0000100023' and sss < '0000200023' ORDER BY rand() LIMIT 100
耗时0.12S, 服务器是阿里云RDS最低配置。
ORDER BY rand() LIMIT N会慢吗?
这也是我目前试的几种里面最快的啦,不知道还有没有更快的方法,所以来求指教一下嘛~
[/quote] 那你就别用sql了 java处理吧 像你说的拿到所有where条件的数据,放list中 然后随机取N条 从list中去随机取 给你一段 list中随机取多少的代码 你看看
/**
* 函 数 名 :getRandomNumList
* 方法描述:随机抽取N个元素
* @param list 总数量
* @param selected 取多少元素
* @return List<String>
*/
public List<bean> getRandomNumList(List<bean> list, int selected) {
List<beanVo> reList = new ArrayList<beanVo>();
Random random = new Random();
for (int i = 0; i < selected; i++) {
// 随机数的范围为0-list.size()-1;
int target = random.nextInt(list.size());
reList.add(list.get(target));
}
return reList;
}[/quote]
刚才回错啦,跑了好几分钟的写法是
SELECT * FROM table
WHERE xxx='xxx' AND id >= (
(SELECT MAX(id) )-
(SELECT MIN(id) FROM table )
) * RAND() + (SELECT MIN(id) )
LIMIT n
取所有再java随机取的方法可以实现啦,但是将近一分钟也还是有点难以忍受啦。
[/quote] 那你就别用sql了 java处理吧 像你说的拿到所有where条件的数据,放list中 然后随机取N条 从list中去随机取 给你一段 list中随机取多少的代码 你看看
/**
* 函 数 名 :getRandomNumList
* 方法描述:随机抽取N个元素
* @param list 总数量
* @param selected 取多少元素
* @return List<String>
*/
public List<bean> getRandomNumList(List<bean> list, int selected) {
List<beanVo> reList = new ArrayList<beanVo>();
Random random = new Random();
for (int i = 0; i < selected; i++) {
// 随机数的范围为0-list.size()-1;
int target = random.nextInt(list.size());
reList.add(list.get(target));
}
return reList;
}
[/quote]
取全部满足where条件的记录,再在java里面随机取若干个,这样从循环六次从一万取150个的单元测试用了将近一分钟,一分钟就已经不能忍受啦
