使用LIMIT + OFFSET 分页时,数据重复的风险

在使用 LIMIT + OFFSET 分页时,数据重复的风险不仅与排序字段的唯一性有关,还与数据变动(插入、删除、更新)密切相关。以下是详细分析:

一、数据变动如何导致分页异常

1. 插入新数据

  • 场景:用户在浏览第 1 页时,数据库插入了新记录。
  • 问题:新记录可能会 "挤入" 已浏览过的页面,导致后续页出现重复数据。
  • 示例

    sql

    -- 初始数据(按ID排序)
    ID  Name
    1   Alice
    2   Bob
    3   Charlie-- 第1页:LIMIT 2 OFFSET 0 → 返回 ID=1,2
    -- 此时插入新记录 ID=4
    -- 第2页:LIMIT 2 OFFSET 2 → 返回 ID=3,4(原第2页是ID=3,出现重复)
    

2. 删除数据

  • 场景:用户浏览第 2 页时,第 1 页的某些记录被删除。
  • 问题:第 2 页数据前移,导致部分记录在第 1 页 "消失",第 2 页重复显示。
  • 示例

    sql

    -- 初始数据(按ID排序)
    ID  Name
    1   Alice
    2   Bob
    3   Charlie
    4   Dave-- 第1页:LIMIT 2 OFFSET 0 → 返回 ID=1,2
    -- 此时删除 ID=1
    -- 第2页:LIMIT 2 OFFSET 2 → 返回 ID=3,4(原第2页是ID=3,4,但用户已看过ID=3)
    

3. 更新排序字段

  • 场景:用户浏览第 1 页时,某条记录的排序字段被更新。
  • 问题:记录位置发生变化,导致分页混乱。
  • 示例

    sql

    -- 按分数降序排列
    ID  Score
    1   90
    2   85
    3   80-- 第1页:LIMIT 2 OFFSET 0 → 返回 ID=1,2
    -- 此时 ID=3 的分数更新为 95
    -- 第2页:LIMIT 2 OFFSET 2 → 返回 ID=2,3(ID=2 重复)
    

二、书签 / 键集分页如何避免此问题

书签分页通过记录绝对位置(如id > 100)而非相对偏移量,天然免疫数据变动影响:

  • 插入新数据:新记录不会影响已获取的页,只会出现在第一页。
  • 删除数据:已获取的页不受影响,后续页自动跳过缺失记录。
  • 更新排序字段:若更新影响排序,可能导致数据 "提前" 出现,但不会重复。

三、如何应对数据变动导致的重复问题

1. 业务层规避

  • 场景:社交动态流、实时评论等高频更新场景。
  • 方案
    • 改用书签分页,确保每次查询基于固定位置。
    • 提供 "刷新" 按钮,允许用户重新获取最新数据。

2. 数据库层保障

  • 事务隔离:在高一致性要求场景,使用REPEATABLE READ隔离级别,确保查询期间数据视图不变。
  • 版本控制:为每条记录添加version字段,每次更新时递增,分页时结合版本号排序。

3. 前端处理

  • 去重逻辑:在前端维护已显示的数据 ID 列表,重复数据自动过滤。
  • 无限滚动优化:加载下一页时,保留当前页最后一条数据的 ID,与新页第一条对比。

四、总结:风险场景与应对策略

场景LIMIT+OFFSET 风险书签 / 键集分页风险应对方案
排序字段唯一 + 无数据变动均可使用
排序字段不唯一 + 无数据变动可能重复添加唯一字段到 ORDER BY
排序字段唯一 + 有数据变动可能重复优先使用书签分页
排序字段不唯一 + 有数据变动高风险低风险键集分页 + 唯一字段 + 前端去重

在实际应用中,若数据变动频繁且对一致性要求高,应优先选择书签 / 键集分页,从根本上避免数据重复问题。若使用LIMIT + OFFSET 分页,则需注意,当第一页查询之后(比如我的查询条件每页都是可用量>0,但是第一页查询之后,我在业务代码中将第一页的可用量全部置为0),再去查询下一页,其实会产生跳页情况,因为此时原第一页数据已经不符合查询条件了,真正的第一页会直接被跳过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87639.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel 数据透视表不够用时,如何处理来自多个数据源的数据?

当数据透视表感到“吃力”时,我们该怎么办: 数据量巨大:Excel工作表有104万行的限制,当有几十万行数据时,透视表和公式就会变得非常卡顿。数据来源多样:数据分散在多个Excel文件、CSV文件、数据库甚至网页…

cf(1034)Div3(补题A B C D E F)

哈,这个比赛在开了不久之后,不知道为啥卡了差不多20来分钟,后面卡着卡着就想睡觉了。实在是太困了.... 题目意思: Alice做一次操作,删除任意数字a,而Bob做一次操作删除b使得ab对4取余是3。 获胜条件,有人…

浏览器与服务器的交互

浏览器地址栏输入URL(网址​​) ​​​​(1) 服务器进行URL解析​​:验证URL格式,提取协议、域名等 ​​​​(2) 服务器进行DNS查询​​:将域名转换为IP地址(可能涉及缓存或DNS预取) ​​​​…

Spring Boot中POST请求参数校验的实战指南

在现代的Web开发中,数据校验是确保应用程序稳定性和安全性的关键环节。Spring Boot提供了强大而灵活的校验机制,能够帮助开发者轻松地对POST请求参数进行校验。本文将详细介绍如何在Spring Boot中实现POST请求参数的校验,并通过具体的代码示例…

Spring Boot + MyBatis/MyBatis Plus:XML中循环处理List参数的终极指南

重要提醒:使用Param注解时,务必导入正确的包! import org.apache.ibatis.annotations.Param; 很多开发者容易错误导入Spring的Param,导致参数绑定失败! 一、为什么需要传递List参数? 最常见的场景是动态构…

Design Compiler:自适应重定时(Adaptive Retiming)

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 简介 重定时是DC Ultra引入的一种时序优化技术,可以将时序单元(触发器和锁存器)穿越组合逻辑前后移动,以优化设…

解决kali Linux在VMware中的全局缩放问题

在每次启动kali时,因为屏幕分辨率过高,系统整体特别小,该怎么操作调整合适呢 在搜索中搜索kali HiDPI Mode 选择yes 然后就会自动调整合适了

Python关键字梳理

在 Python 中,关键字(Keywords)是具有特殊含义的保留字,它们用于定义语法和结构。async 是 Python 3.5 引入的关键字,用于支持异步编程(Asynchronous Programming)。下面我将详细讲解 async 及其…

结构体实战:用Rust编写矩形面积计算器

文章目录结构体实战:用Rust编写矩形面积计算器📐 问题描述1️⃣ 基础版:独立变量(混乱版)2️⃣ 进阶版:使用元组3️⃣ 终极版:使用结构体(优雅版)🎯 运行结果…

基于开源链动2+1模式AI智能名片S2B2C商城小程序的场景零售创新研究

摘要:本文聚焦场景消费逻辑,探讨开源链动21模式AI智能名片S2B2C商城小程序在场景零售中的应用。通过分析场景消费中消费者体验的关键作用,结合该技术组合的特性,阐述其如何优化场景内容、增强场景美感,为消费者创造超乎…

新发布:26考研院校和专业大纲

复习方向错了,努力可能白费 近日,多所高校陆续发布2026年硕士研究生招生考试自命题科目大纲,为备考的学子们指明了复习方向。今年的考纲有哪些重要变化?又该如何应对?本文为你全面梳理! 院校和专业发布详情…

matlab/Simulink-全套50个汽车性能建模与仿真源码模型9

50个simulink模型(所有模型罗列如下,没罗列就是没有,包含子模块总共50个。) 基于汽车驱动力-行驶阻力平衡图的汽车动力性仿真模型 基于汽车动力特性图的汽车动力性仿真模型 基于汽车功率平衡图的汽车动力性仿真模型 电动汽车动力…

为什么星敏感器(Star Tracker)需要时间同步?—— 从原理到应用的全解析

为什么星敏感器(Star Tracker)需要时间同步?—— 从原理到应用的全解析 引言 在卫星姿态控制系统中,星敏感器(Star Tracker, 简称“星敏”) 是最精确的姿态测量设备之一,其精度可达角秒级&…

【Cocos TypeScript 零基础 24.1】

目录 首次实战开发心得实战项目<修仙录游戏> 首次实战开发心得 遇到的技术问题也多 发表问题也不少 收入问题 本人都将会写篇专栏总结一下 实战项目<修仙录游戏> 上图是已上线的实战项目二维码 耗费的时间太久了 下次将跟新开发遇到的各种奇奇怪怪的问题 各位看…

Linux关机指令详解:shutdown命令的使用指南

掌握shutdown命令的正确使用对于Linux系统管理员至关重要&#xff0c;它不仅能确保系统安全关闭&#xff0c;还能避免数据丢失和用户工作中断。 目录 一、基本语法 二、常用选项 三、使用示例 立即关机 10分钟后关机 指定时间关机&#xff08;如23:00&#xff09; 重启系…

青少年编程与数学 02-022 专业应用软件简介 08 电子设计自动化软件

青少年编程与数学 02-022 专业应用软件简介 08 电子设计自动化软件一、什么是EDA软件&#xff08;一&#xff09;定义与起源&#xff08;二&#xff09;功能与分类&#xff08;三&#xff09;技术发展趋势二、EDA软件在当前国际竞争中的重要性&#xff08;一&#xff09;技术壁…

TypeScript系列:第六篇 - 编写高质量的TS类型

掌握这些&#xff0c;ts类型声明事半功倍 &#x1f4aa;&#x1f3fb; 不要做 永远不要使用类型 Number、String、Boolean、Symbol 或 Object 这些类型指的是非原始装箱对象&#xff0c;使用 number、string、boolean 和 symbol 类型不要使用 any 作为类型&#xff0c;除非正在…

逐步构建高性能http服务器及聊天室服务器

目录 如何拿到浏览器发来的http请求 如何给浏览器发送响应 响应基本原理 给浏览器发送一个网页作为响应 给浏览器发送一个图片作为响应 接下来我们要做什么 完善业务逻辑 浏览器如何访问特定文件 访问根目录下的文件 访问子文件夹下的文件 习惯性目录结构 GET请求带…

水下航行器外形分类详解

在水下航行器的设计领域&#xff0c;外形是影响其性能和功能的关键因素之一。根据不同的设计目的和应用场景&#xff0c;水下航行器的外形可以按照多种方式进行分类。 本文将详细介绍几种常见的分类方式及其对应的外形特点。 按流体动力布局分类 标准回转体 外形标准回转体外…

Ubuntu:Mysql服务器

mariadb与mysql完全兼容&#xff0c;使用时感受不到差别 目录 1 mariadb的安装2 启动mysql3 关闭防火墙4 连接到mysql5 Mysql的配置文件6 Mysql远程访问 1 mariadb的安装 apt install mariadb-server检查安装 ls /etc/init.d2 启动mysql service mysql restart3 关闭防火墙…