高效快速不重复随机读取数据库mysql数据方式

很多网站都有一个随便看看功能,常见的实现方式是通过数据库的rand()函数来随机排序实现获取随机的数据,但是效率不高,并且每次获取的数据没有关联,会出现重复的数据。

 

如果业务上需要随机读取表中的数据,但是每次读取的数据不能重复怎么实现呢

 

我在网上找了一圈,没有找到可行方案,最后自己想到了一个方法

 

如果数据的主键id是UUID最好实现,或者数据中有稍微长一点点的字符串字段

 

因为我的数据id的主键是UUID,查询数据之前,通过random类计算出两个随机数,每次查询数据库都带上这两个随机的数字,通过数据库的sub函数截取id的随机范围,通过这个id的子串排序实现随机数据的读取,并且每次读取都不会得到重复的数据。

 

说的可能有点抽象,我举个例子

 

比如我的数据库中的数据有三条数据,它们的id分别是

id

003c34f3648c4c8aaf8a8049fcc8d706

2bc9193f577b4b52a34bd85bf4307c11

55d4e5da10ad454e9f3ecf87d8f86b69

 

id字符串总长是32,通过random类计算截取id的哪部分,比如得到的开始位置是3,长度5,那么查询的语句就是   select * from xxx ORDER BY SUBSTR(id,${position},${len}) limit 0,10   

 

003c34f3648c4c8aaf8a8049fcc8d706

2bc9193f577b4b52a34bd85bf4307c11

55d4e5da10ad454e9f3ecf87d8f86b69

排序之后得的结果就是 2 1 3

 

下次再读取可以重新计算截取的部分,就会得到其他的顺序,例如

 

003c34f3648c4c8aaf8a8049fcc8d706

2bc9193f577b4b52a34bd85bf4307c11

55d4e5da10ad454e9f3ecf87d8f86b69

 

 

 

如果没有这种长的字符串,数字也行,如果每个字段的值都很短,也可以通过concat函数将多个列的值拼到一起再截取排序。

end

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值