精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

分頁查詢的穩定性陷阱與根治方案

數據庫 其他數據庫
本文將揭示這一問題的根本原因,對比分析三種主流解決方案的優劣,并最終給出可落地的工程規范,幫助你一勞永逸地解決分頁穩定性問題。

在后端開發中,分頁查詢是最基礎也最常用的功能之一。無論是運營后臺各模塊的列表,還是APP上商品列表、帖子列表、關注/粉絲列表等,幾乎都離不開「按時間倒序+分頁」的查詢組合。但就是這個看似簡單的需求,卻因“錨點不穩定”而暗藏數據重復、丟失的陷阱,輕則影響體驗,重則導致資損。本文將揭示這一問題的根本原因,對比分析三種主流解決方案的優劣,并最終給出可落地的工程規范,幫助你一勞永逸地解決分頁穩定性問題。

案例

首先我們基于一些案例來感受一下,什么是“分頁錨點不穩定”問題。

案例1:社交場景展示的帖子列表按「最新時間排序」,當有新帖子發布時,用戶在翻頁過程中會發現同一條帖子重復出現在不同的頁碼。

案例2:運營人員正在批量發放優惠券,此時新增了一批優惠券數據。發放完成后發現,部分用戶收到了多張相同的優惠券,造成資損。

案例3:某支付流水查詢頁面,因為排序字段不唯一,導致數據展示順序混亂,甚至出現數據丟失,給用戶帶來困擾。

當我們使用LIMIT offset, size(MySQL)或from + size(ES)時,分頁的依據是「當前查詢結果集的行數偏移」。而新數據插入或舊數據的刪除會直接改變結果集的行數,進而導致下一頁的偏移量失效。

案例1只是導致用戶體驗類的bug,而另外兩個案例則影響更加嚴重,很容易出現資損。

分析

我們從案例1入手分析。假設用戶A正在瀏覽帖子列表,操作流程如下:

第1步:加載第1頁

執行SQL:select * from t order by create_time desc LIMIT 0,10

返回帖子 P1~P10(P1 為最新,P10 為第10新的帖子)。

第2步:加載第2頁

此時,其他用戶發布了一條新帖子 P0(時間比 P1 更新)。

用戶A繼續滑動,執行SQL:select * from t order by create_time desc LIMIT 10,10

按理應該返回 P11~P20,但由于新插入了1條數據,整個結果集向后偏移,實際返回的是 P10~P19。

結果:P10 在第1頁和第2頁都出現了,造成數據重復。

更極端的情況是,如果新數據插入量大于等于頁大小,用戶可能會遇到「連續多頁顯示相同數據」,甚至「永遠無法看到后續數據」的問題。

解決方案

方案 1:「時間戳 + 唯一鍵」做「游標分頁」

這是目前最主流、最徹底的方案,核心是放棄「偏移量(offset)」,改用「上一頁最后一條數據的標記」作為分頁錨點,徹底擺脫結果集變化的影響。

實現原理

  1. 確定「唯一排序鍵」:必須包含「時間字段(如create_time)+ 唯一鍵(如id)」,確保排序唯一(解決場景 3 的順序混亂)。
  2. 分頁時不傳遞offset,而是傳遞「上一頁最后一條數據的create_time和id」。
  3. 下一頁查詢用「大于 / 小于」條件過濾,替代LIMIT offset, size。

SQL示例

  • 第 1 頁查詢(無錨點,取最新 10 條)
SELECT id, title, create_time FROM posts
ORDER BY create_time DESC, id DESC
LIMIT 10;

假設第 1 頁最后一條數據為create_time='2024-05-20 14:30:00',id=100。

  • 第 2 頁查詢(用錨點過濾):
SELECT id, title, create_time FROM posts
WHERE create_time <= '2024-05-20 14:30:00' -- 時間早于上一頁最后一條
AND id < 100 -- 時間相同則id更小
ORDER BY create_time DESC, id DESC
LIMIT 10;

方案優勢

  • 徹底解決重復/跳過:錨點是具體數據標記,不受新數據插入、舊數據刪除影響。
  • 性能優異:where 條件可創建聯合索引(create_time, id),避免全表掃描。
  • 兼容性強:同時解決排序不唯一問題。

方案劣勢

  • 不支持直接跳頁:無法像LIMIT 40,10那樣直接跳轉到第 5 頁,僅支持上一頁/下一頁或滑動加載。

適用場景

  • 所有C端滑動加載場景(帖子、商品、評論列表等)。
  • 數據量較大(萬級以上),需優化分頁性能的場景。
  • 同樣適合定時任務通過此方法遍歷全表刷歷史數據。

方案 2:時間戳過濾

由于方案1無法支持自由分頁,可通過「固定查詢時間范圍」減少新數據影響,核心是讓每次分頁查詢的「時間窗口」固定,避免新數據進入結果集。

實現原理

  1. 第一次查詢時,記錄「當前時間」作為max_create_time。
  2. 后續分頁查詢均加create_time <= max_create_time條件,新插入數據不滿足條件被排除;
  3. 用戶刷新頁面時,重新獲取最新max_create_time,更新時間窗口。

SQL示例

  • 第 1 頁查詢(記錄時間窗口):
-- 假設當前時間為2024-05-20 15:00:00
SELECT id, title, create_time FROM posts
WHERE create_time <= '2024-05-20 15:00:00' -- 固定時間窗口
ORDER BY create_time DESC, id DESC
LIMIT 0,10;
  • 第 2 頁查詢(沿用時間窗口):
SELECT id, title, create_time FROM posts
WHERE create_time <= '2024-05-20 15:00:00' -- 不更新時間
ORDER BY create_time DESC, id DESC
LIMIT 10,10; -- 正常取第二頁數據即可,區別**方案1**

方案優勢

  • 實現簡單,成本低,只需記錄首次查詢時間,無需修改核心邏輯;首次查詢的時間可以傳給客戶端,后續分頁查詢讓客戶端把首次查詢的時間傳給服務端即可,不需要服務器暫存此參數。
  • 快速解決新數據重復:新數據被排除在時間窗口外,結果集穩定。

方案劣勢

  • 無法解決數據刪除導致的跳過:若時間窗口內數據被刪除,會導致部分數據被跳過。
  • 數據滯后,用戶滑動分頁時看不到新數據,需刷新頁面或者重新查詢才能更新。
  • 深分頁性能問題,比如LIMIT 1000000, 10。

適用場景

  • 所有C端滑動加載場景(帖子、商品、評論列表等)。
  • 特別適合只增不刪的場景,比如查看訪客記錄。
  • 適合不存在深分頁的業務場景,用戶手動翻頁一般很少翻到100頁往后。

方案 3:適用于Elasticsearch的專屬優化方案

上面講到的方案1和2同樣適用于Elasticsearch,參考MySQL的實現方式,可以在Elasticsearch手動實現。但方案2在深分頁場景下,Elasticsearch默認限制查詢結果窗口大小為10000條記錄,超過該值會觸發錯誤提示“Result window is too large”。

為解決此類問題,Elasticsearch 提供 “滾動查詢(Scroll)” 和“Search_after”功能。

  • Search_after:分頁時需要排序,原理是從上一次的排序值開始,查詢下一頁數據,不需要指定偏移量from,直接取前size條即可。官方推薦使用的方式。和方案1實現原理類似。
  • Scroll:原理將排序后的文檔ID形成快照,保存在內存,后續分頁基于快照查詢,不受數據更新影響。官方已經不推薦使用。

代碼示例(search_after方式)

// 第1頁查詢
SearchRequest request = new SearchRequest("posts");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 按create_time(降序)、id(降序)排序
sourceBuilder.sort("create_time", SortOrder.DESC);
sourceBuilder.sort("id", SortOrder.DESC);
sourceBuilder.size(10);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);

// 獲取第1頁最后一條數據的排序值(作為下一頁的游標)
SearchHit lastHit = response.getHits().getHits()[response.getHits().getHits().length - 1];
// [1716215400000(create_time的時間戳), "100"(id)]
Object[] lastSortValues = lastHit.getSortValues();

// 第2頁查詢(用Search After)
sourceBuilder.searchAfter(lastSortValues); // 傳入上一頁的游標
sourceBuilder.size(10);
request.source(sourceBuilder);
SearchResponse page2Response = client.search(request, RequestOptions.DEFAULT);

方案優勢

  1. 適合ES海量數據的獲取:避免from + size在from較大時的性能問題(ES 會將前 N 條數據加載到內存)。
  2. 兼容性強:同時解決排序不唯一問題。

方案劣勢

  1. 不支持直接跳頁:無法像LIMIT 40,10那樣直接跳轉到第 5 頁,僅支持上一頁/下一頁或滑動加載。

適用場景

  1. ES 大數據量全量導出(如導出近 1 個月日志、批量導出 Excel)
  2. 同方案1列舉的場景

總結

  1. 問題本質:分頁重復/跳過源于「錨點不穩定」(用offset易受數據增刪影響)和「排序不唯一」(單一字段排序規則不固定),解法是用「數據標記錨點」(如游標)和「唯一排序組合」(如create_time + id)。
  2. 方案選擇邏輯:按「是否需跳頁→數據量→更新頻率」決策,如B端需跳頁且數據量小用LIMIT + 時間戳,C 端滑動加載且數據量大用游標分頁,ES 批量導出用Search_after。
  3. 規范價值:技術方案解決單次問題,建立工程規范(需求 - 編碼 - 測試 - 監控)將個人經驗轉化為團隊標準,CR分頁查詢代碼重點關注排序項是否唯一、是否游標分頁、分頁是否有防重措施等,避免重復踩坑,保障分頁功能穩定,提升用戶體驗與業務營收。

關于作者,張叢叢,俠客匯Java開發工程師。

責任編輯:武曉燕 來源: 轉轉技術
相關推薦

2011-08-01 11:03:15

2023-04-26 18:36:13

2011-12-21 09:46:46

程序員

2009-07-27 10:08:14

2022-02-24 08:18:12

穩定性高可用可用性

2020-07-13 08:10:13

軟件設計系統

2020-07-28 08:07:14

ElasticSear

2022-06-14 14:57:47

穩定性高可用流程

2022-09-15 08:33:27

安全生產系統Review

2023-06-30 08:43:36

2010-05-12 11:24:16

2009-12-23 18:18:04

2010-08-14 09:46:05

2022-10-20 12:04:08

2022-05-12 18:09:18

Kubernetes公有云

2016-10-18 13:31:23

CronPaxos服務

2016-12-21 09:33:40

2025-10-27 01:11:00

雪崩TimeoutRetry

2013-05-23 16:00:20

負載均衡網絡優化網絡升級

2024-12-12 09:18:21

點贊
收藏

51CTO技術棧公眾號

欧美床上激情在线观看| 欧美日韩综合视频网址| 亚洲aaaaaa| 久久免费黄色网址| 欧美日韩一区二区三区在线电影 | 国产一区福利在线| 色综合天天综合网国产成人网 | 91精品国产91久久久久久最新 | 欧美国产另类| 日韩精品小视频| 不卡中文字幕在线观看| 麻豆免费在线| 18欧美亚洲精品| 亚洲最大激情中文字幕| 日日夜夜操视频| 欧美精品导航| 中文字幕国产精品久久| 无码国产精品一区二区免费式直播 | 欧美大胆视频| 欧美一区二区三区公司| 欧美视频免费播放| 国产美女一区视频| 国产精品毛片久久久久久久| 精品视频一区二区三区四区| 国产精品高潮呻吟AV无码| 免费亚洲网站| 性欧美视频videos6一9| 国产在线一卡二卡| 日韩欧美精品综合| 亚洲欧美在线一区| 亚洲天堂美女视频| 爱高潮www亚洲精品| 欧美一区二区三区免费大片 | 欧美交换配乱吟粗大25p| 激情小视频在线| 91免费看片在线观看| 91国产在线免费观看| 91成人在线免费| 日韩中文字幕区一区有砖一区| 久久免费精品日本久久中文字幕| 成年人一级黄色片| 久久久久久久久久久久久久| 国产亚洲欧美日韩精品| 天天躁日日躁aaaxxⅹ| 美女一区二区在线观看| 亚洲成人激情视频| 国产成人精品一区二区三区在线观看 | 成人av番号网| 亚洲综合免费视频| 美女www一区二区| 国产精品嫩草视频| 中国一级特黄视频| 老司机精品视频在线| 国产精品网站入口| 亚洲一区二区三区网站| 久久99热这里只有精品| 91精品久久久久久久久不口人| 在线视频播放大全| 久久成人羞羞网站| 91久久精品国产91久久| 国产男女猛烈无遮挡| 精品亚洲国内自在自线福利| 成人免费午夜电影| 国产高清免费在线观看| 粉嫩av一区二区三区粉嫩| 国产精品xxx在线观看www| 日韩在线观看视频一区| 久久综合色播五月| 日韩免费av电影| 秋霞a级毛片在线看| 亚洲欧洲无码一区二区三区| 精品一区二区三区毛片| caoporn-草棚在线视频最| 亚洲午夜视频在线观看| 男人添女人下面高潮视频| 日本免费久久| 这里是久久伊人| 在线xxxxx| 国产亚洲一区二区三区不卡| 日韩网站免费观看高清| 少妇影院在线观看| 先锋影音久久久| 国产精品日韩一区| 精品国产乱码久久久久久蜜臀网站| 成人精品视频一区二区三区| 久久久久久九九九九| 日本福利在线| 亚洲国产视频直播| 热久久精品免费视频| 国产精品久久久久久久久久久久久久久| 欧美一级精品在线| 白嫩情侣偷拍呻吟刺激| 精品国产一区二区三区噜噜噜 | 欧美激情国产精品免费| 亚洲免费网站| 91久久久精品| 欧美日韩激情视频一区二区三区| 中文av一区特黄| 久久99久久久久久| 精品国产欧美日韩一区二区三区| 欧美一区日韩一区| 37p粉嫩大胆色噜噜噜| 亚洲va在线| 日本在线精品视频| 丰满少妇高潮在线观看| 亚洲国产精品国自产拍av| 日韩一区二区高清视频| 久久er热在这里只有精品66| 亚洲第一区在线观看| 成人18视频免费69| 久久激情综合| 国产在线精品一区二区三区》| 乱人伦中文视频在线| 日韩欧美精品网站| 中文字幕制服丝袜| 国产高清久久| 国产精品白嫩美女在线观看| 日本韩国在线观看| 亚洲男人天堂一区| 天天干天天玩天天操| 欧美一区自拍| 久久久免费精品视频| 国产又粗又猛又爽又黄视频| 国产欧美精品在线观看| 精品久久一二三| 在线视频亚洲欧美中文| 久久久国产精品视频| 成人免费毛片视频| www日韩大片| 免费特级黄色片| 欧美另类中文字幕| www.亚洲人.com| 中文在线观看av| 久久久精品国产免大香伊| 少妇人妻在线视频| 国产亚洲成av人片在线观黄桃| 理论片在线不卡免费观看| 中文字幕第三页| 日本一区二区成人在线| 玩弄japan白嫩少妇hd| 丝袜美腿综合| 欧美一区二区三区四区在线| 午夜福利视频一区二区| 婷婷成人综合网| 中文字幕一区二区三区乱码不卡| 国产精品porn| 粉嫩精品一区二区三区在线观看 | 亚洲黄色小视频| 无套内谢丰满少妇中文字幕| 综合在线视频| 99久re热视频这里只有精品6| 国产三级在线播放| 欧美一区二区播放| 清纯粉嫩极品夜夜嗨av| 国产精品亚洲午夜一区二区三区| www.69av| 久久a级毛片毛片免费观看| 国产+成+人+亚洲欧洲| 日本韩国免费观看| 色噜噜狠狠成人网p站| 欧美熟妇激情一区二区三区| 蜜桃视频一区二区三区在线观看| 在线一区高清| 日韩三级网址| 国语自产精品视频在免费| 五月婷婷在线观看视频| 在线一区二区观看| 中文字幕求饶的少妇| 国产精品99久久久久久似苏梦涵| 日本人妻伦在线中文字幕| 精品福利一区| 国产成人精品视频| 黄色片免费在线观看| 欧美成人精品二区三区99精品| 国产午夜福利一区二区| 国产三级三级三级精品8ⅰ区| 中文字幕网av| 黄色亚洲精品| 日韩一本精品| 欧美成人精品一级| 国产91精品久久久久久久| 欧美伦理影视网| 欧美美女一区二区在线观看| 国产精品theporn动漫| 久久久三级国产网站| 狠狠干狠狠操视频| 在线日本高清免费不卡| 色姑娘综合网| 91精品尤物| 国产精品欧美日韩| 青青草原国产在线| 欧美一区二区三区四区五区 | 老司机一区二区三区| 日韩精品无码一区二区三区| 亚洲网一区二区三区| 国产成人精品久久| 欧美aaa免费| 一区二区欧美久久| 色婷婷av一区二区三| 欧美日韩久久久一区| 日本天堂网在线观看| 国产精品护士白丝一区av| 一起草在线视频| 久久精品国产亚洲a| 日韩在线一级片| 欧美欧美全黄| 亚洲欧美国产一区二区| 露出调教综合另类| av一区观看| 日本精品久久| 国产成人激情小视频| h片在线观看| 久久精品一本久久99精品| 理论在线观看| 亚洲精品国产成人| 性欧美一区二区三区| 欧美日韩国产影片| 波多野结衣午夜| 欧美日韩午夜视频在线观看| 青娱乐国产盛宴| 中文字幕一区三区| 久久国产柳州莫菁门| 91在线国内视频| 波多野结衣办公室双飞| 国产乱码精品一区二区三区av| 天美星空大象mv在线观看视频| 亚洲人人精品| 被灌满精子的波多野结衣| 欧美一区在线看| 伊人久久99| 91日韩在线| 亚洲国产精品久久久久婷婷老年| 精品影片在线观看的网站| 精品免费日产一区一区三区免费| 97人人澡人人爽91综合色| 国产在线视频一区| 久久人体av| 国产精品网红福利| 亚洲伦理一区二区| 成人免费福利在线| 国产精品3区| 91免费视频网站| 精品国产第一国产综合精品| 成人午夜在线观看| **国产精品| 91中文字精品一区二区| 色妞ww精品视频7777| 粉嫩av一区二区三区免费观看| 99国产精品免费网站| 成人性色av| 伦理一区二区| 欧美三级网色| 久久香蕉国产| 中国老女人av| 国产精品mv在线观看| 国产精品12345| 校园春色综合网| 高清一区二区视频| 激情综合色综合久久综合| 中文字幕一区二区在线观看视频| 国产在线视频一区二区三区| 伊人av在线播放| www..com久久爱| 99久久久无码国产精品性| 欧美激情一区二区在线| 国产精品69久久久久孕妇欧美| 国产精品大尺度| 久久精品国产亚洲AV无码男同| 第一福利永久视频精品| 波多野结衣电影在线播放| 欧美日韩亚洲综合一区| 国产ts变态重口人妖hd| 亚洲国产又黄又爽女人高潮的| 嫩草研究院在线观看| 中文字幕在线亚洲| 午夜影院免费在线| 欧美亚洲国产另类| 欧美综合社区国产| 国产免费高清一区| 成人中文在线| 日本香蕉视频在线观看| 天堂在线亚洲视频| xxxx国产视频| 国产亚洲欧美一级| 精品国产乱码久久久久久鸭王1 | 色综合久久久久无码专区| 日韩精品一区第一页| 欧美高清精品一区二区| 91天堂素人约啪| 欧美a级片免费看| 亚洲观看高清完整版在线观看| 亚洲综合久久网| 欧美一区二区福利视频| 精品一二三区视频| 欧美高跟鞋交xxxxhd| 亚洲成人激情社区| 国产成人女人毛片视频在线| 国产欧美一区| 天堂8在线天堂资源bt| 蜜臀av在线播放一区二区三区| 中文字幕av一区二区三区人妻少妇| 2021久久国产精品不只是精品| 国产免费美女视频| 色婷婷综合视频在线观看| 国产手机精品视频| 亚洲偷熟乱区亚洲香蕉av| 国产三线在线| 91日韩在线播放| 国产欧美久久一区二区三区| 99热亚洲精品| 韩国女主播成人在线观看| 受虐m奴xxx在线观看| 性欧美大战久久久久久久久| 国产精品久久欧美久久一区| 亚洲欧美激情在线视频| 99爱在线视频| 99re视频在线| 亚洲高清影视| 欧美日韩亚洲自拍| 久久婷婷国产综合国色天香| 久久综合加勒比| 日韩三级高清在线| 久草免费在线| 国产欧美一区二区三区在线| 偷拍一区二区| 9久久9毛片又大又硬又粗| 国产宾馆实践打屁股91| 午夜爽爽爽男女免费观看| 欧美日韩一区在线观看| av影片免费在线观看| 日本一区二区不卡| 最新国产一区| 成人观看免费完整观看| 99久久综合国产精品| 欧美日韩一级在线观看| 欧美一区二区高清| av网址在线播放| 69堂成人精品视频免费| 亚洲激情中文在线| 亚洲图片 自拍偷拍| 亚洲人成网站色在线观看| 国产精品一区二区免费视频| 日日噜噜噜夜夜爽亚洲精品| 国产日韩在线观看视频| 久久99国产精品一区| 国产精品夜夜嗨| 国产一级免费av| 欧美精品一区二区三区在线| 成人ssswww在线播放| 久久av一区二区| 性久久久久久| 蜜桃av乱码一区二区三区| 欧美性淫爽ww久久久久无| 在线免费观看的av网站| 成人国产精品一区| 午夜久久久久| 欧美激情 亚洲| 欧美视频裸体精品| 国产鲁鲁视频在线观看免费| 国产精品高潮视频| 999国产精品999久久久久久| 美女被艹视频网站| 亚洲妇女屁股眼交7| 亚洲色图狠狠干| 国产精品扒开腿爽爽爽视频 | 国产亚洲午夜高清国产拍精品| 天天干,天天干| 精品激情国产视频| 6080成人| 日本wwww视频| 国产精品成人在线观看| www.我爱av| 欧洲亚洲在线视频| 99精品在线免费在线观看| 久久久国产精品久久久| 欧美日韩国产精品一区| 1769视频在线播放免费观看| 亚洲在线观看视频| 亚洲免费网站| 欧美丰满熟妇bbbbbb| 日韩电影中文字幕av| 欧美高清你懂的| 黄色激情在线视频| 国产精品全国免费观看高清| 午夜精品久久久久久久99| 日本成人激情视频| 999国产精品| 性少妇bbw张开| 日韩欧美电影一二三| 欧美大片免费观看网址| 国产成人三级视频| 久久久久久夜精品精品免费| 国产精品视频一二区| 奇米成人av国产一区二区三区| 香蕉国产精品| 一区二区三区免费在线观看视频 | 国产999免费视频| 色狠狠色狠狠综合| 国产探花视频在线观看| 亚洲一卡二卡|