栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

MySQL的ORDER BY RAND()如何工作?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MySQL的ORDER BY RAND()如何工作?

尽管没有“通过rand()快速订购”之类的东西,但是有针对您特定任务的解决方法。

要获取任何随机行 ,您可以像德国博主一样:http : //www.roberthartung.de/mysql-order-by-
rand-a-case-study-of-alternatives/
(我看不到一个热链接网址。如果有人看到,请随时编辑该链接。)

文本是德语,但是SQL代码在页面下方并且在大白框中,因此不难看出。

基本上,他所做的是做一个程序来获取有效行。这将生成一个介于0到max_id之间的随机数,尝试获取一行,如果不存在该行,请继续进行操作,直到找到一个行为止。他允许通过将它们存储在临时表中来获取x个随机行,因此您可能可以重写该过程,以便仅提取一行就更快了。

这样做的缺点是,如果您删除很多行,并且存在巨大的差距,那么很有可能错过很多次,从而使其无效。

更新:不同的执行时间

SELECt * FROM table ORDER BY RAND()LIMIT 1; / 30-40秒 /

SELECt ID FROM table ORDER BY RAND()LIMIT 1; / 0.25秒 /

SELECT ID,用户名,来自表ORDER BY RAND()LIMIT 1;/ 90秒 /

我一直希望对所有三个查询都看到大致相同的时间,因为我总是在单个列上进行排序。但是由于某种原因,这没有发生。如果您对此有任何想法,请告诉我。

它可能与索引有关。

id
被索引并可以快速访问,而添加
username
到结果中则意味着它需要从每一行中读取它并将其放入内存表中。使用,
*
它还必须将所有内容读取到内存中,但不需要在数据文件中跳转,这意味着不会浪费时间寻找。

仅当存在可变长度的列(varchar / text)时,这才有所不同,这意味着必须先检查长度,然后跳过该长度,而不是仅跳过每行之间的设置长度(或0)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/392812.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号