首页 > 解决方案 > 在mysql中使用大数据集随机化结果的最快方法

问题描述

我想从要扫描大量行的表中随机返回行顺序

试过:

1) select * from table order by rand() limit 1

2) select * from table where id in (select id from table order by rand() limit 1)

2 比 1 快,但在大行表上仍然太慢

更新: 查询在实时应用程序中使用。插入、选择和更新大约为 10/秒。所以缓存将不是理想的解决方案。这种特定情况所需的行数是 1。但也在寻找一个通用的解决方案,其中查询速度很快并且需要的行数>1

标签: mysqlsqlrandomsql-order-by

解决方案


最快的方法是在 mysql 中使用准备好的语句和限制

select @offset:=floor(rand()*total_rows_in_table);
PREPARE STMT FROM 'select id from table limit ?,1';
EXECUTE STMT USING @offset; 

total_rows_in_table= 表中的总行数。

与以上两个相比,它要快得多。

限制:获取超过 1 行并不是真正随机的。


推荐阅读