Mysql rand()函数-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Mysql rand()函数

2016-02-08 15:31:12 2325 1

查询语句
SELECT * FROM tablename ORDER BY RAND() LIMIT 100
查询效率极其低下,解释如下:
works for small tables, but once the tables grow larger than 300,000
records or so this will be very slow because MySQL will have to process
ALL the entries from the table, order them randomly and then return the
first row of the ordered result, and this sorting takes long time.
Instead you can do it like this (atleast if you have an auto_increment PK):
可见得扫描全表再做随机排序,效率怎么能不低。
网上的解决办法
SELECT * FROM 'table'
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM 'table'))) 
ORDER BY id LIMIT 100;
通过 max(id) * rand()来确定随机数,不过个人认为这个办法有很大的局限
1)
RAND()*MAX(id)的值如果是最大id值,那怎么可能查的出来100条数据
2)
再者,如果id不是连续的,比如 1,2,3,1000,那这个查询也有问题
难道RAND()没有很好的解决方案?

取消 提交回答
全部回答(1)
  • 蛮大人123
    2019-07-17 18:39:42

    MySQL中ORDER BY RAND的确有性能问题,因为MySQL必需遍历所有的记录才能得到结果。
    如果你只要100个,你可以考虑先select all id,从中随机挑选100个id,然后再select by id,这样会比较快,当然对于太大的dataset这样依然会有潜在的性能问题。
    如果你的记录集实在太大,比如超过100M,那么你必须用一些变通的手段,比如定期随机给所有记录加上一个随机的RANK之类。

    0 0
相关问答

1

回答

【RDS】RDS MySQL如何终止会话?

2022-01-12 16:17:02 464浏览量 回答数 1

1

回答

RDS MySQL如何终止会话?

2022-01-07 14:15:23 885浏览量 回答数 1

1

回答

RDS MySQL实例间的迁移中数据库账号的权限要求是什么?

2021-12-14 15:35:52 193浏览量 回答数 1

1

回答

RDS MySQL实例间的迁移中迁移类型说明是什么?

2021-12-14 15:34:59 110浏览量 回答数 1

1

回答

RDS MySQL实例间的迁移中费用说明是什么?

2021-12-14 15:34:37 111浏览量 回答数 1

1

回答

RDS MySQL实例间的迁移中特殊情况的说明是什么?

2021-12-14 15:34:12 149浏览量 回答数 1

1

回答

RDS MySQL实例间的迁移中其他限制的说明是什么?

2021-12-14 15:33:50 91浏览量 回答数 1

1

回答

RDS MySQL实例间的迁移中源库限制的说明是什么?

2021-12-14 15:33:27 96浏览量 回答数 1

1

回答

RDS MySQL实例间的迁移中前提条件是什么?

2021-12-14 15:33:02 146浏览量 回答数 1

1

回答

RDS MySQL实例间的迁移中支持的源库和目标数据库是什么?

2021-12-14 15:32:38 185浏览量 回答数 1
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
0
文章
7733
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载