使用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
英文地址,請注明出處:http://en.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 關閉防火墻…