精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美久久久久久久久久久久| 日日摸日日碰夜夜爽av| 国产精品久久久久久免费| 天天综合精品| 精品处破学生在线二十三| 伊人久久大香线蕉成人综合网| 一级特黄aa大片| 欧美伊人久久| 日韩精品www| 亚洲天堂网一区| 国产黄大片在线观看画质优化| 国产成人精品亚洲日本在线桃色 | 美女搡bbb又爽又猛又黄www| 黄网站app在线观看| 成人毛片视频在线观看| 人妖精品videosex性欧美| 国产欧美小视频| 999在线精品| 在线亚洲一区观看| 精品人妻大屁股白浆无码| 可以在线观看的黄色| 国产麻豆视频一区| 日韩av色综合| 久久久久久久久久久久久久久久久| 亚洲黄色录像| 欧美va日韩va| 久久国产这里只有精品| 日本午夜大片a在线观看| 国产精品久久久久一区二区三区 | 黄频视频在线观看| 五月天激情开心网| 国产乱码精品一区二区三| 欧美激情一级二级| 日韩av手机在线免费观看| 精品网站aaa| 在线免费av一区| 少妇人妻无码专区视频| 麻豆视频在线播放| 久久亚洲综合av| 98国产高清一区| 中文字幕日韩经典| 欧美专区18| 久久久久久久久久久网站| 欧美a级片免费看| 亚洲品质自拍| 精品调教chinesegay| 污污视频网站在线| 在线成人视屏| 色94色欧美sute亚洲线路一久| 大胆欧美熟妇xx| 毛片在线播放a| 久久色.com| 国产一区精品在线| 成人免费视频国产免费麻豆| 国产麻豆精品theporn| 国产精品免费网站| 波多野结衣视频在线看| 久久久亚洲一区| 欧美制服第一页| 啦啦啦免费高清视频在线观看| 国模吧视频一区| 麻豆成人在线看| av资源在线免费观看| 波多野结衣在线播放一区| 亚洲全黄一级网站| 丰满圆润老女人hd| 给我免费播放日韩视频| 亚洲成年人在线播放| 国产精品91av| 999久久精品| 亚洲白拍色综合图区| 国产资源中文字幕| 欧美国产中文高清| 欧美tk—视频vk| 黄色在线免费播放| 林ゆな中文字幕一区二区| 亚洲二区在线播放视频| 在线黄色免费网站| 欧洲精品一区| 国产午夜精品一区二区三区| 国产精品成人无码免费| 日韩精品诱惑一区?区三区| 在线性视频日韩欧美| 亚洲精品午夜视频| 日韩一级毛片| 欧美二区在线播放| 国产无人区码熟妇毛片多| 天堂va蜜桃一区二区三区漫画版 | 无码aⅴ精品一区二区三区| 午夜在线一区| 国产精品国模在线| www.国产毛片| 狠狠色丁香婷婷综合| 亚洲自拍偷拍视频| 天堂av中文字幕| 久久久美女艺术照精彩视频福利播放| 日本不卡一区二区三区视频| 欧美性天天影视| 亚洲精品中文在线| 免费观看日韩毛片| 日韩色性视频| 亚洲国产精品久久| 色婷婷av777| 色婷婷亚洲mv天堂mv在影片| 久久人人爽人人人人片| 国产精品麻豆一区二区三区| 国产欧美综合在线| 在线视频91| 好久没做在线观看| 在线一区二区三区四区五区 | 四虎国产精品免费观看| 另类图片亚洲另类| 国产又黄又爽又色| 久久99国产精品免费网站| 成人久久18免费网站漫画| 亚洲人成色777777精品音频| 中文在线资源观看网站视频免费不卡| 久久综合亚洲精品| 亚洲精品国产嫩草在线观看| 欧美tickling挠脚心丨vk| 大地资源二中文在线影视观看| 欧美成免费一区二区视频| 欧美另类交人妖| 中文字幕精品一区二| 成人午夜免费视频| 日本不卡一区二区三区在线观看| 午夜小视频福利在线观看| 五月婷婷综合激情| 三级黄色片播放| 精品国产一区二区三区av片| 久久久人成影片一区二区三区观看| 一级黄色免费网站| 国产精品资源站在线| 日本一区高清不卡| 黑森林国产精品av| 日韩亚洲欧美在线| 麻豆精品免费视频| 99国产精品视频免费观看一公开| 国产精品无码专区在线观看| 神马久久久久| 亚洲成av人片一区二区梦乃| 亚洲一级片免费观看| 欧美在线电影| 国模精品视频一区二区三区| 99久久婷婷国产一区二区三区| 免费成人av在线| 欧美动漫一区二区| 成人免费看黄| 亚洲日本aⅴ片在线观看香蕉| 亚洲欧美偷拍一区| 久久久久久久久岛国免费| 国模吧无码一区二区三区| 亚洲涩涩av| 日韩免费在线免费观看| 国产三级在线| 欧美日韩日本视频| 男人av资源站| 国产一区 二区 三区一级| avav在线播放| 九九热播视频在线精品6| 777午夜精品福利在线观看| 深夜福利视频一区| 在线免费观看日韩欧美| 国产精品69久久久久孕妇欧美| 狠狠色2019综合网| 日韩精品免费一区| 噜噜噜天天躁狠狠躁夜夜精品| 91精品国产乱码久久久久久蜜臀 | 伦理一区二区| 日韩av电影手机在线观看| fc2在线中文字幕| 91精品国产一区二区| 久草视频手机在线观看| 91免费视频观看| 九热视频在线观看| 中文在线日韩| 久久国产精品99久久久久久丝袜| 日日av拍夜夜添久久免费| 久久久久北条麻妃免费看| 国产自产一区二区| 欧美制服丝袜第一页| 久久久久久视频| 99精品国产一区二区三区不卡| 99视频精品免费| 在线电影一区二区| 美国av一区二区三区| 欧美大片网站| 91成品人片a无限观看| 99青草视频在线播放视| 精品福利在线导航| 自拍偷拍精品视频| 亚洲成人一区二区在线观看| 亚洲欧美va天堂人熟伦| 国产91精品一区二区麻豆网站| 欧美 日韩精品| 午夜精品久久99蜜桃的功能介绍| 欧美一区1区三区3区公司| 久久免费福利| 国产精品美女久久| 爱草tv视频在线观看992| 色偷偷噜噜噜亚洲男人的天堂| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 欧美亚洲禁片免费| 精品国产免费观看| 亚洲欧美在线视频观看| 精品一区二区视频在线观看| 久久99精品国产.久久久久久| 国产综合av在线| 亚洲乱码电影| 日本高清不卡一区二区三| 精品一区二区三区四区五区| 欧美重口另类videos人妖| aa在线视频| 在线看日韩av| 清纯唯美亚洲色图| 亚洲大胆人体av| 99热这里只有精品在线观看| 欧美丝袜丝交足nylons图片| 美女又爽又黄免费视频| 亚洲高清免费在线| 波多野结衣爱爱视频| 中文字幕第一页久久| 最新中文字幕视频| 成人高清在线视频| 精品国产免费久久久久久婷婷| 麻豆中文一区二区| 日韩免费毛片视频| 亚洲伊人观看| 男的插女的下面视频| 欧美黄色精品| 欧美aaa在线观看| 91综合网人人| 亚洲精品一品区二品区三品区| 神马电影久久| 欧美极品日韩| 在线成人动漫av| 欧美国产二区| 国产永久精品大片wwwapp| 精品午夜一区二区三区| 美女呻吟一区| 国产综合18久久久久久| 国产人妖ts一区二区| 国产亚洲欧美一区二区三区| 亚洲网址在线观看| 不卡的av一区| 99re8这里有精品热视频免费| 97人人模人人爽人人少妇 | 国产伦精品一区二区三区四区视频| 日韩免费高清视频网站| 国产精成人品localhost| 福利电影一区| 鲁丝片一区二区三区| 亚洲免费毛片| 亚洲精品一区二区三区av| 91久久夜色精品国产按摩| 自拍偷拍一区二区三区| 欧美激情一级片一区二区| 欧美黑人在线观看| 国产农村妇女毛片精品久久莱园子| 欧美精品99久久| 日本亚洲一区二区| gai在线观看免费高清| 国产一区不卡视频| 少妇激情一区二区三区视频| xnxx国产精品| 黄色av片三级三级三级免费看| 国产精品久久久久三级| 成年人av电影| 精品国产乱码久久久久酒店| 无码人妻精品一区二区三区9厂| 在线亚洲一区二区| 一级黄色大毛片| 日韩欧美国产三级| 视频一区二区在线播放| 一区二区三区视频在线| av免费在线观看网址| 91精品国产免费久久久久久| 日本精品在线一区| 亚洲综合中文字幕在线观看| 精品嫩草影院| 亚洲春色在线| 国产综合视频| 福利在线一区二区三区| 国产综合久久久久久鬼色| 亚洲国产精品无码久久久久高潮| 久久久不卡网国产精品一区| 看片网站在线观看| 欧美性少妇18aaaa视频| av一区二区三| 亚洲欧美成人网| 18+激情视频在线| 国产极品精品在线观看| 欧美第一在线视频| 水蜜桃一区二区| 亚洲福利一区| 成年人网站av| 国产日产精品一区| 国产精品99精品无码视| 欧美视频一区二| 天堂av网在线| 欧美刺激性大交免费视频| 韩国精品主播一区二区在线观看 | 日韩一区免费视频| 色黄久久久久久| 正在播放日韩精品| 99久久综合狠狠综合久久止| 第一社区sis001原创亚洲| 婷婷五月综合缴情在线视频| 久久99国产精品久久99果冻传媒| aaaaa级少妇高潮大片免费看| 亚洲免费电影在线| 欧美性受xxx黑人xyx性爽| 亚洲精品98久久久久久中文字幕| 麻豆传媒在线观看| 国产精品极品美女在线观看免费| 国产精品毛片视频| 日本一区二区三区四区五区六区| 日韩一区精品视频| 三上悠亚ssⅰn939无码播放| 亚洲综合久久久久| 国产强被迫伦姧在线观看无码| 国产一区二区免费| 欧美成a人片在线观看久| 久久国产精品99久久久久久丝袜| 狠狠88综合久久久久综合网| 国产探花在线观看视频| 中文字幕亚洲视频| 亚洲午夜在线播放| 中日韩午夜理伦电影免费| 欧美成人性网| 中文字幕一区二区三区四区| 婷婷中文字幕在线观看| 99精品在线观看| koreanbj精品视频一区| 成人免费视频视频在线观看免费| 欧洲猛交xxxx乱大交3| 91精品久久久久久久91蜜桃| 日本激情视频在线观看| 国产区亚洲区欧美区| 色综合色综合| 色一情一区二区三区| 国产精品婷婷午夜在线观看| 波多野结衣绝顶大高潮| 国产亚洲综合久久| 成人av色网站| 亚洲毛片aa| 国产制服丝袜一区| 顶臀精品视频www| 日韩欧美在线不卡| 国产网红女主播精品视频| 成人精品一二区| 91久久在线| 久久无码人妻精品一区二区三区| 欧美性猛交xxxx富婆弯腰| 美女毛片在线看| 国产精品精品一区二区三区午夜版| 精品视频免费| 一道本视频在线观看| 成人免费一区二区三区视频| 99久久精品免费看国产交换| 欧美精品成人在线| 欧美三级电影在线| av无码精品一区二区三区| 欧美激情一区在线| 国产绳艺sm调教室论坛| 久久久久久久久国产精品| 视频福利一区| 午夜激情在线观看视频| 国产精品麻豆久久久| 国产激情久久久久久熟女老人av| 欧美激情二区三区| 校园春色另类视频| 中文字幕视频三区| 一区二区三区欧美日| 四虎影视在线观看2413| 国产精品久久不能| 欧美在线观看天堂一区二区三区| 稀缺小u女呦精品呦| 色噜噜狠狠色综合中国| 成人在线播放| 久久综合一区二区三区| 久久99精品久久只有精品| 国产精品9191| 日韩中文有码在线视频| 国产精品网址| 91高清国产视频| 五月婷婷久久丁香| 在线a免费看| 国产一区自拍视频| 精品一区二区免费看| 国产成人无码精品亚洲| 日韩亚洲一区二区| 欧美激情久久久久久久久久久| 男女男精品视频站| 婷婷综合另类小说色区| 91porn在线观看| 精品伦精品一区二区三区视频| 久久99在线观看| 久久国产视频精品| 欧美老女人性视频|