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

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

时间:2024-08-08 22:54:08浏览次数:17  
标签:count 数据库 ID 获取 limit 随机 mysql id select

需求:从商品库中随机获取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

标签:count,数据库,ID,获取,limit,随机,mysql,id,select
From: https://blog.csdn.net/m0_53626105/article/details/141036543

相关文章

  • Mysql:初始化
    免费的社区版下载地址:https://dev.mysql.com/downloads/mysql 下载mysql.zip包,直接解压cdmysql-8.0.28-winx64新增my.ini文件[mysql]default-character-set=utf8#默认字符集[mysqld]port=3306#端口basedir=D:/XXX/mysql-8.0.28-winx64#修改成实......
  • mysql系列之事务(三)
    1.为什么需要事务首先我们要知道什么是事务:事务(Transaction)是‌数据库系统中执行的一个工作单位,它是由用户定义的一组操作序列。一个事务可以是一组‌SQL语句、一条SQL语句或整个程序,一个应用程序可以包括多个事务。通俗易懂来说就是,我们在执行一个操作时,要保证要么都成......
  • Java 怎么获取支付宝Open ID
    在Java中获取支付宝用户的OpenID,通常是通过支付宝的开放平台API来完成的。OpenID是支付宝用于唯一标识一个支付宝用户的字符串,它在OAuth授权流程中被用来获取用户的身份和权限。下面我将给出一个基于Java使用SpringBoot框架和支付宝开放平台SDK来获取用户OpenID的详细步骤和示例......
  • mysql在软件实施中常用到的语句
    MySQL在软件实施中常用到的语句非常广泛,涵盖了数据定义(DDL)、数据操纵(DML)、数据查询(DQL)和数据控制(DCL)等多个方面。以下是一些常用的MySQL语句及其用途,这里列举了一部分:1.数据定义语言(DDL)创建数据库CREATEDATABASE数据库名称;//创建一个新的数据库。CREATEDATABASEI......
  • 用Python简单操作MySQL!轻松实现数据读写
    PyMySQL是Python编程语言中的一个第三方模块,它可以让Python程序连接到MySQL数据库并进行数据操作。它的使用非常简单,只需要安装PyMySQL模块,然后按照一定的步骤连接到MySQL数据库即可。本文将介绍PyMySQL的安装、连接MySQL数据库、创建表、插入数据、查询数据、更新数据和删除数据......
  • String类的获取功能方法 day11
    packagecom.shujia.day11;/*String类的获取功能intlength()获取字符串中的字符个数charcharAt(intindex)根据索引获取对应的字符intindexOf(intch)......
  • MySQL高级——MySQL储存引擎
    一、概念1)数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。2)不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。3)用户可......
  • MySQL——数据库的设计、事务、视图
    文章目录数据库的设计1.多表之间的关系2.实现关系3.数据库设计的范式事务1.事务的基本介绍2.事务的四大特征ACID3.事务的隔离级别(了解即可)视图1.什么是视图?2.视图创建及使用方法3.注意事项4.为什么使用视图数据库的设计1.多表之间的关系一对一(了解)如:人和身份证......
  • 面试官:说说MySQL调优?
    MySQL作为关系型数据库的典型代表,其流行程度超越于任何数据库,因此在Java面试中,MySQL是一定会被问到的重要知识点。而在MySQL中有一道极其常见的面试题,我们这里系统的来看一下,这就是我们今天要讨论的MySQL调优问题。MySQL调优的大体思路如下:具体调优思路如下。1.查询......
  • openvslam 优化误差问题 随机一致性 核函数 信息矩阵(高斯牛顿)
     优化问题  我们的目标就是找到一组a,b,λa,b,\lambdaa,b,λ的解,使得式(1)整体值最小,也就是各个点到曲线的距离在y方向的和最小。 鲁棒核函数假设现在散点中一个很离谱的错误点由于右上角那个离谱的点,导致优化时将整个函数被拉偏了(可以对比图3)。那么怎么解决......