mysql - 在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
解决方案
最快的方法是在 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 行并不是真正随机的。
推荐阅读
- reactjs - 将 NextJS 静态站点迁移到 squarespace/cms
- javascript - Alpine.js 无法将 x-data 绑定到外部 js 文件中的 functin
- mysql - 如何在选择查询中使用案例别名
- flutter - 导入的图片库出错
- python - Windows / Linux SQLAlchemy 连接器转换类型错误
- java - 从 JNI_OnLoad 返回的错误 JNI 版本,Android 11 崩溃
- python - 'pip install 和有什么区别
' 和 'python -m pip install '? - elasticsearch - 如何在 ElasticSearch 中的索引期间从现有字段创建新字段?
- javascript - 将数组中的先前文本移动到最新文本下方而不是被覆盖
- javascript - localStorage 检查器在看起来不错时不起作用?