需求:从商品库中随机获取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讲】
-
取得整个表的行数,记为C;
-
根据相同的随机方法得到Y1、Y2、Y3;【可以使用Java程序实现】
-
再执行三个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
标签:count,数据库,ID,获取,limit,随机,mysql,id,select From: https://blog.csdn.net/m0_53626105/article/details/141036543