背景
在项目中遇到了一下随机获取数据的情况 下面找到了几种随机的方法,提供参考
实现思路
既然是要实现随机,那么可以从数据库的函数入手 或者从开发语言的随机函数入手 数据库数据存了 2006052 条数据 进行测试
方案实现
1.使用order by rand() 和 limit()
sql语句
select * from test_name order by rand() limit 10;
limit 10 查询时间在 1.26 s limit 1 查询时间在 0.764 s 速度有些慢,不是太建议使用
2.使用 join 和 rand
SELECT
*
FROM
test_name AS t1
JOIN (
SELECT
ROUND(
RAND() *
(
( SELECT MAX( id ) FROM `test_name` )
- ( SELECT MIN( id ) FROM test_name )
)
+ ( SELECT MIN( id ) FROM test_name )
) AS id
) AS t2
WHERE
t1.id >= t2.id
ORDER BY
t1.id
LIMIT 10
limit 10 查询时间在 0.053 s limit 1 查询时间在 0.051 s 速度还行,但是在limit 10 的时候,会直接输出顺序的十条记录,只是起始位置变了
实现逻辑是 将最大的id减去最小的id 然后随机从中取一个id出来 然后在原来的表中取出大于这个id的数据 这个方法只适用id为顺序自增的表
3.使用 子查询 和 rand
SELECT *
FROM test_name
WHERE id >=
(
(
SELECT MAX( id )
FROM test_name
)
-(
SELECT MIN( id )
FROM test_name )
) * RAND()
+ ( SELECT MIN( id ) FROM test_name )
LIMIT 10
limit 10 查询时间在 0.0734s limit 1 查询时间在 0.071 s 速度还行 实现逻辑(和方法二 相同)是 将最大的id减去最小的id 然后随机从中取一个id出来 然后在原来的表中取出大于这个id的数据 这个方法只适用id为顺序自增的表
4.在Java代码中随机id 和 in
int limit = 10;
List<Long> allIdList = getAllIdList();
int allIdListSize = allIdList.size();
List<Long> randIdList = new ArrayList();
for(int i = 0; i < limit; i++) {
randIdList.add(RandomUtil.randomInt(count));
}
return selectByBatchIds(randIdList);
查询速度很慢 只适合少量数据
优点是可以查询非连续id的数据 如果指定id的构建方式, 可以实现更快的方式随机