使用sql语句在mysql的表中随机获取数据,以及改进方案

75 篇文章 5 订阅

rand()获取随机数据问题

有时候会有这样的业务场景,随机获取几条数据,网上一搜有好多使用

select * from xxx order by rand() limit x

在数据量比较小的时候这个是没问题的,但是一旦数据量上来就会非常的慢
,我自己本地搞了900w+的数据,随机取6条就需要大概20s+。

原因是扫描了全表,这还了得。。。

在这里插入图片描述

在这里插入图片描述

解决方案

方法1:
mysql里的id一般都是聚簇索引,这个时候我们可以利用上id来做操作

建议查询10次以下用这个语句多次查询比一次rand()效率高的多,每次都是获取的不同的数据。
不直接limit 10的原因是这样获取的数据都是连续的id了。

select u.* from 
user u join (
	select ROUND(
		(rand() * (select max(id) from user) - (select min(id) from user)) + (select min(id) from user)
	) as id
) u2
where u.id >= u2.id
limit 1

在这里插入图片描述

方法2:
也可以这样操作,如果只需要获取100条,那么我们可以在方法1的基础上获取200条然后在内存中再随机取100条,这样也可以。

比如java可以直接利用

//洗牌
Collections.shuffle();

打乱List的顺序,然后捞指定数量的数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值