rand()查询效率问题解决

随机从数据表中取一条数据,我们一般会用到rand()函数,但是如果用不好的话,rand()的效率实在太低。

基础使用

SELECT * FROM tablename ORDER BY RAND() LIMIT 1

这是最基本的rand()用法。

实例测试

我再表里加了一千万条测试数据。

select * from card order by rand() limit 1;

这条语句竟然用了23秒多(我的机子性能还算可以的了),这实在令人崩溃。后来去看了mysql官方手册,里边意思是在order by 从句中使用rand()时,会导致数据列被多此扫描,所以效率会极低。

优化

后来在某社区发现了一个有趣的写法,先查出来表中最大的id,再查出来表中最小的id,然后两个id加起来,再用rand()函数乘以加以来的结果,用floor函数向下取整,取出id大于这个这个整数的数据,用时0.002秒,跟之前那种写法简直是天壤之别。

SELECT * FROM card
WHERE card_id >= (SELECT FLOOR( RAND() *((SELECT MAX(card_id) FROM card)-(SELECT MIN(card_id) FROM card)) + (SELECT MIN(card_id) FROM card))) ORDER BY card_id DESC;

注意

这里解释下为什么要用最大值,最小值相加的结果,而不用count函数,因为count算出来的结果不一定比最大的id大,这样的话随机出来的结果就会有瑕疵;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对这是我的昵称

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值