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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)