数据库动态增删数据,导致分页查询数据出现重复或遗漏的问题分析及解决方案
一、问题分析
1. 请求数据
一般情况下,为了减少服务器的压力或方便展示,前端通过分页方式来请求数据,调用 API 接口时会带上参数 page 与 pageSize。例如请求某个班级的学生数据,获取第一页的 10 个学生的数据 ,假设按注册时间倒序排列:
https://api.domain.com/class/student/list?page=1&pageSize=10
分页查询采用 SQL limit 语句来实现,limit 用法:
select * from table_name limit [offset,] rows
offset:指定第一个记录行的偏移量(即从哪一行开始返回),注意:初始行的偏移量为0。
rows:返回具体行数。
请求第一页数据,page = 1,offset 就等于 (1 - 1) * 10, 也就是 0;
select * from tb_student order by register_time desc limit 0, 10;
请求第二页数据,page = 2,offset 就等于 (2 - 1)*10, 也就是 10;
select * from tb_student order by register_time desc limit 10, 10;
2. 数据重复或缺失
假设已经获取到第一页数据,在请求第二数据之前,后台新注册了一个学生,如果按注册时间倒序排列,这个新注册的学生就成了第一条数据,如果按「堆栈」的方式来理解:原先第一页的数据的最后一条,因为新数据的插入,被 PUSH 到第二页的第一条数据的位置上,因此当我们获取第二页数据时,就会「重复」获取到原先第一页数据的最后一条记录,当出现这种情况发生时,前端通常会显示两条紧挨着且完全相同的学生数据。
同样的道理,假如我们获取第二页数据前,原先第一页的学生因为注销,从数据库里删除了,所有的数据的起始位置偏移量都减 1,第二页的第一条数据变成了第一页的最后一条数据,所以我们请求第二页数据返回的结果就会「缺失」这一条数据。
总结:当数据库数据发生了动态改变,如果我们的 offset 没有实时动态的修正,仍然固定不变的使用 offset = (page - 1) * pageSize 的方式来获取数据,就会出现数据重复或缺失的情况。
二、解决方案
经过上面的分析,我们知道每次请求数据,如果能获取到正确的 offset,就不会出现上诉的问题,这个 offset 应该是请求第一页学生数据的最后一条学生记录「在所有学生按注册时间倒序排列时」所处的位置。因此,我们获取到最后一条记录的 ID,通过参数 「fromId = ID」 上传给后台提供的接口,通过计算获取到请求下一页数据正确的 offset,这样不管数据库数据如何增删,都不会出现重复或遗漏的情况。通俗来说,每一次请求数据,都从 formIId 所代表的的记录的下一条记录开始获取 10 条新的记录。
请求第一页数据,fromId = 0
https://api.domain.com/class/student/list?fromId=0&pageSize=10
我们约定 fromId = 0,代表请求第一页数据,因此 offset 值为0;假设第一页数据的最后一条数据的 student_id = 1001;
请求第二页数据,带上参数 fromId = 1001;
https://api.domain.com/class/student/list?fromId=1001&pageSize=10
后台实时计算,获取到最后一条记录(fromId)的下一条记录的起始位置:
select count(*) from tb_student where register_time >= (select register_time from tb_student where student_id = 1001);
注意事项:1. 该语句里面嵌套了一个select 查询,内层嵌套查询语句只能返回唯一一条记录,不能出现多条记录,否则执行 sql 后会抛出错误。
2. 如果按注册时间升序排列," >= " 应该替换替换为 " <= "。
3. 用于排序的字段 register_time 不能存在相同的值,否则也可能会导致查询的数据缺失(例如第 11 条数据与第 10 条数据的 register_time 值相同,执行上述 SQL 语句获取到的 offset 值会导致第 11 条数据不会出现在第二页请求的数据里)。
用上面 SQL 查询语句返回的值作为请求第二页学生数据的 offset,查询语句如下:
select * from tb_student order by register_time desc limit [offset,] 10;
相关文章:
数据库动态增删数据,导致分页查询数据出现重复或遗漏的问题分析及解决方案
一、问题分析 1. 请求数据 一般情况下,为了减少服务器的压力或方便展示,前端通过分页方式来请求数据,调用 API 接口时会带上参数 page 与 pageSize。例如请求某个班级的学生数据,获取第一页的 10 个学生的数据 ,假设按…...
神经网络基础-神经网络补充概念-44-minibatch梯度下降法
概念 小批量梯度下降法(Mini-Batch Gradient Descent)是梯度下降法的一种变体,它结合了批量梯度下降(Batch Gradient Descent)和随机梯度下降(Stochastic Gradient Descent)的优点。在小批量梯…...
比较海思麒麟810与高通骁龙855的优劣
海思麒麟810与高通骁龙855可以从以下几方面进行比较: 一、CPU比较 海思麒麟810还是高通骁龙855——哪个处理器更快?在这个比较中,我们观察了差异,并分析了这两个CPU中哪一个更好。我们比较了技术数据和基准测试结果。 海思麒麟810有8个内核和8个线程,时钟最高频率为2.2…...
计算机机房的管理
1 电源问题 不稳定的电源对电脑的使用寿命是一个极大的威胁,特别是对于机房来说危害 性更大。为此,学校要添置必要的稳压器,设置其正常供电的电压为 220 伏、电流 为 l6 安对电脑室供电。如有电压发生偏差,要及时检查供电情况&…...
软件架构生态化-多角色交付的探索实践
作为一个技术架构师,不仅仅要紧跟行业技术趋势,还要结合研发团队现状及痛点,探索新的交付方案。在日常中,你是否遇到如下问题 “ 业务需求排期长研发是瓶颈;非研发角色感受不到研发技改提效的变化;引入ISV …...
基于YOLOv5n/s/m不同参数量级模型开发构建茶叶嫩芽检测识别模型,使用pruning剪枝技术来对模型进行轻量化处理,探索不同剪枝水平下模型性能影响【续】
这里主要是前一篇博文的后续内容,简单回顾一下:本文选取了n/s/m三款不同量级的模型来依次构建训练模型,所有的参数保持同样的设置,之后探索在不同剪枝处理操作下的性能影响。 在上一篇博文中保持30的剪枝程度得到的效果还是比较理…...
深度解析 Llama 2 的资源汇总:不容错过
“ 探索 Llama 2 背后的过程,包括了模型的全面解析,在线体验,微调,部署等,这份资源汇总将带您深入了解其内涵。” 01 — 周二发布了文章《中文大模型 Chinese-LLaMA-Alpaca-2 开源且可以商用》后,不少朋友们…...
Git 删除 GitHub仓库的文件
新建文件夹 git bash here 在新建的文件夹里右键git bash here打开终端,并执行git init初始化仓库 git clone <你的地址> 找到github上要删除的仓库地址,并复制,在终端里输入git clone <你的地址> 要删除文件的库里右键git b…...
如何使用 ChatGPT 将文本转换为 PowerPoint 演示文稿
推荐:使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 步骤 1:将文本转换为幻灯片演示文稿 第一步涉及指示 ChatGPT 根据给定的文本生成具有特定数量幻灯片的演示文稿。首先,您必须向 ChatGPT 提供要转换的文本。 使用以下提示指示…...
html(七)meta标签
一 meta标签 1、背景:发现自带某些请求头2、本文没有实际的生产应用场景,仅仅作为技术积累 ① meta标签含义 1、metadata: 元数据,是用于描述数据的数据,它不会显示在页面上,但是机器却可以识别2、应用场景: [1]、SEO搜索引擎优化[2]、定义页面使用…...
《Go 语言第一课》课程学习笔记(五)
入口函数与包初始化:搞清 Go 程序的执行次序 main.main 函数:Go 应用的入口函数 Go 语言中有一个特殊的函数:main 包中的 main 函数,也就是 main.main,它是所有 Go 可执行程序的用户层执行逻辑的入口函数。 Go 程序在…...
Golang 并发编程基础
runtime 包,定义了协程管理相关的 API runtime.Gosched() package mainimport ("fmt""runtime" )func main() {go func() {for i : 0; i < 5; i {fmt.Println(i)}}()// 让出当前CPU给其他协程runtime.Gosched()fmt.Println("end...&qu…...
代码随想录算法训练营(二叉树总结篇)
一.二叉树的种类 1.满二叉树:就是说每一个非叶子节点的节点都有两个子节点。 2.完全二叉树:此二叉树只有最后一层可能没填满,并且存在的叶子节点都集中在左侧!!! (满二叉树也是完全二叉树&…...
华为开源自研AI框架昇思MindSpore应用案例:基于MindSpore框架的UNet-2D案例实现
目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 二、环境准备与数据读取三、模型解析Transformer基本原理Attention模块 Transformer EncoderViT模型的输入整体构建ViT 四、模型训练与推理模型训练模型验证模型推理 近些年,随着基于自注意&…...
Python入门【TCP建立连接的三次握手、 TCP断开连接的四次挥手、套接字编程实战、 TCP编程的实现、TCP双向持续通信】(二十七)
👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…...
React笔记-React入门
主要是现在要改一个开源项目,需要学习下React入门,在此记录一下。 几个关键的库 React底层核心:react.development.js React操作DOM库:react-dom.development.js 解析ES6语法:babel.min.js React.createElement() …...
SD WebUI 扩展:prompt-all-in-one
sd-webui-prompt-all-in-one 是一个基于 Stable Diffusion WebUI 的扩展,旨在提高提示词/反向提示词输入框的使用体验。它拥有更直观、强大的输入界面功能,它提供了自动翻译、历史记录和收藏等功能,它支持多种语言,满足不同用户的…...
Go和Java实现中介者模式
Go和Java实现中介者模式 下面通过一个同事之间相互通信的例子来说明中介者模式的使用。 1、中介者模式 中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的 通信,并支持松耦合,使代码…...
CentOS系统环境搭建(十五)——CentOS安装Kibana
centos系统环境搭建专栏🔗点击跳转 关于Elasticsearch的安装请看CentOS系统环境搭建(十二)——CentOS7安装Elasticsearch。 CentOS安装Kibana 文章目录 CentOS安装Kibana1.下载2.上传3.解压4.修改kibana配置文件5.授予es用户权限6.kibana 后台…...
简单的洗牌算法
目录 前言 问题 代码展现及分析 poker类 game类 Text类 前言 洗牌算法为ArrayList具体使用的典例,可以很好的让我们快速熟系ArrayList的用法。如果你对ArrayList还不太了解除,推荐先看本博主的ArrayList的详解。 ArrayList的详解_WHabcwu的博客-CSD…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
