【mysql随机获取3条不重复数据】最佳实践

需求:从商品库中随机获取3个不重复的商品,推荐给用户。假设product表数据为10000行。

方案一【最佳实际】

1.mysql数据库中获取所有商品数据的ID

select id from product;

2.通过Java获取随机3个商品ID

// 假设List中存的为上述数据库ID值
List<Integer> productIdList = new ArrayList<>();
// 打乱ID顺序
Collections.shuffle(productIdList);
// 截取前三个ID值
List<Integer> subList = productIdList.subList(0, 3);

3.回表查出对应推荐的3个商品数据

-- 开发中最好不要使用select *
select id, name, url from product where id in( , , )

说明:此方案是作者所能想到针对数据库性能的最佳方案,欢迎大家再评论区提出更好的方案。

扫描行数:10000 + 3

方案二【第二选择】

1.获取数据库总行数 

-- 获取数据库总行数
select count(*) from product;

2.获取数据库ID值

// 假设count为查询出的商品数
Integer count = 10000;
// nextInt包括左边界值,不包括右边界值所以+1,我想取至少三个商品因此-3
int bound = count + 1 - 3;
Random random = new Random();
int id = random.nextInt(bound);

3.从数据库中取大于ID值的三个商品

select id, name, url from product where id > #{id} limit 3;

注意:这个随机数为伪随机,因为每次取的都是ID值连续的三个商品;

扫描行数 :10000 + 3 = 10003

方案三【mysql45讲】

  1. 取得整个表的行数,记为C;

  2. 根据相同的随机方法得到Y1、Y2、Y3;【可以使用Java程序实现】

  3. 再执行三个limit Y, 1语句得到三行数据。

select count(*) into @C from t;
set @Y1 = floor(@C * rand());
set @Y2 = floor(@C * rand());
set @Y3 = floor(@C * rand());
select * from t limit @Y1,1; //在应用代码里面取Y1、Y2、Y3值,拼出SQL后执行
select * from t limit @Y2,1;
select * from t limit @Y3,1;

说明:此方案参考mysql45讲中第17讲中的解决方案。但是存在生成随机数相同情况,不满足我所需要三个不重复数据的情景。

扫描行数:10000 + 10001 + 10001 + 10001 = 40003

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值