mysql高性能随机排序

mysql高性能随机排序,第1张

第一种:MySQL 随机排序常规写法:展开目录

SELECT*FROMusersWHEREtotalScoreBETWEEN5AND100ORDERBYRAND()LIMIT100

执行耗时 1.18s

SELECT*FROMusersWHEREtotalScoreBETWEEN5AND100ORDERBYRAND()LIMIT100

执行耗时 1.25s

这样的耗时不能接受。

第二种:stackoverflow 上找了一个黑科技写法:展开目录

SELECT*FROMusersWHEREtotalScoreBETWEEN5AND100ORDERBY37*(UNIX_TIMESTAMP() ^id) &0xffffLIMIT100

执行耗时 150ms

SELECT*FROMusersWHEREtotalScoreBETWEEN5AND100ORDERBY37*(UNIX_TIMESTAMP() ^id) &0xffffLIMIT100

执行耗时 153ms

执行耗时直接缩短至 150ms,已经比上一个写法快很多了,而且 LIMIT 1000 时耗时也是 150ms 左右。

第三种方式:展开目录

SELECT*

FROMusersASu

INNERJOIN(SELECTidFROMusersWHEREtotalScoreBETWEEN5AND100ORDERBYRAND()LIMIT100)AStONt.id=u.id

WHERE1

执行耗时 110ms

LIMIT 1000 时耗时也稳定在 110ms 左右。

耗时最少,推荐使用第三种。

在随机抽取数据,并且数据量超过1万的时候,这种写法效率太低。

写法1:

按目前各种论坛博客查到的资料,换成这种可以成倍的提升效率

写法2:

1.当数据量小于1万时,写法1与写法2在效率上没有差异。

2.当数据量大到一定程度时,写法1的性能会迅速下降。40万订单数据,随机抽取5条耗时11s。同样条件下,写法2耗费时间0.03s。

3.写法2不适用于经过一定规则生成的id为主键的表,而且取出的 数据是连续的 ,所以只能一次查询一条。但是效率上依旧完胜于写法1。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7189980.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-02
下一篇 2023-04-02

发表评论

登录后才能评论

评论列表(0条)

保存