随机从数据库中获取数据的思考

2022-06-29919

背景

在项目中遇到了一下随机获取数据的情况 下面找到了几种随机的方法,提供参考

实现思路

既然是要实现随机,那么可以从数据库的函数入手 或者从开发语言的随机函数入手 数据库数据存了 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的构建方式, 可以实现更快的方式随机

分享
点赞0
打赏
上一篇:Docker常用命令笔记(一)
下一篇:selenium中的鼠标操作