日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

盤點分頁查詢中遇到的坑!

來源: 責編: 時間:2024-09-10 09:47:03 179觀看
導讀01、問題背景最近部分用戶反饋在 APP 上查詢自己名下訂單數據時,當往下拉取數據的時候,列表上出現重復的訂單數據,經過代碼排查,后端代碼是通過如下方式來實現數據的分頁查詢的。limit offset, size order by create_time

01、問題背景

最近部分用戶反饋在 APP 上查詢自己名下訂單數據時,當往下拉取數據的時候,列表上出現重復的訂單數據,經過代碼排查,后端代碼是通過如下方式來實現數據的分頁查詢的。ZjO28資訊網——每日最新資訊28at.com

limit offset, size order by create_time desc

一開始大家都不以為然,這么標準的寫法,怎么可能會出錯!但經過細致的分析,這種排序方式,在 app 端分頁查詢的時候,確實存在問題。ZjO28資訊網——每日最新資訊28at.com

詳細的分析過程如下!ZjO28資訊網——每日最新資訊28at.com

02、原因分析

首先我們初始化一張表,用于模擬訂單表查詢。ZjO28資訊網——每日最新資訊28at.com

CREATE TABLE `tb_order` (  `order_id` bigint(11) unsigned NOT NULL,  `create_time` datetime DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

然后初始化 5 條數據進去,方便數據分析ZjO28資訊網——每日最新資訊28at.com

INSERT INTO `tb_order` (`order_id`, `create_time`) VALUES (1, '2023-03-03 12:00:01');INSERT INTO `tb_order` (`order_id`, `create_time`) VALUES (2, '2023-03-03 12:00:02');INSERT INTO `tb_order` (`order_id`, `create_time`) VALUES (3, '2023-03-03 12:00:03');INSERT INTO `tb_order` (`order_id`, `create_time`) VALUES (4, '2023-03-03 12:00:04');INSERT INTO `tb_order` (`order_id`, `create_time`) VALUES (5, '2023-03-03 12:00:05');

假設我們每次只查詢 2 條數據,并且按照時間倒序來查詢,結果如下:ZjO28資訊網——每日最新資訊28at.com

-- 發起第一頁查詢select * from tb_order order by create_time desc limit 0,2;-- 第一頁查詢結果|order_id |   create_time       ||5        |  2023-03-03 12:00:05||4        |  2023-03-03 12:00:04|-- 發起第二頁查詢select * from tb_order order by create_time desc limit 2,2;-- 第二頁查詢結果|order_id |   create_time       ||3        |  2023-03-03 12:00:03||2        |  2023-03-03 12:00:02|

當訂單數據沒有發生變動的時候,這種查詢方式是不會造成出現重復的數據問題。ZjO28資訊網——每日最新資訊28at.com

但是當訂單數據發生了變動,比如在查詢的時候,突然新增了訂單數據,此時的查詢結果就完全不一樣了。ZjO28資訊網——每日最新資訊28at.com

還是以上面為例,假設在第一次查詢的時候,突然新增了一條數據,看看結果如何。ZjO28資訊網——每日最新資訊28at.com

-- 發起第一頁查詢select * from tb_order order by create_time desc limit 0,2;-- 第一頁查詢結果|order_id |   create_time       ||5        |  2023-03-03 12:00:05||4        |  2023-03-03 12:00:04|-- 新增一條訂單數據INSERT INTO `tb_order` (`order_id`, `create_time`) VALUES (6, '2023-03-03 12:00:06');-- 發起第二頁查詢select * from tb_order order by create_time desc limit 2,2;-- 第二頁查詢結果|order_id |   create_time       ||4        |  2023-03-03 12:00:04||3        |  2023-03-03 12:00:03|

可以很明顯的發現,訂單【ID=4】的數據,出現在頁面上兩次,正常情況下只有一次!ZjO28資訊網——每日最新資訊28at.com

圖片圖片ZjO28資訊網——每日最新資訊28at.com

上面說到的是新增一條數據,假設刪除某條數據,看看結果如何。ZjO28資訊網——每日最新資訊28at.com

-- 發起第一頁查詢select * from tb_order order by create_time desc limit 0,2;-- 第一頁查詢結果|order_id |   create_time       ||5        |  2023-03-03 12:00:05||4        |  2023-03-03 12:00:04|-- 刪除一條訂單數據delete from tb_order where order_id = 4;-- 發起第二頁查詢select * from tb_order order by create_time desc limit 2,2;-- 第二頁查詢結果|order_id |   create_time       ||2        |  2023-03-03 12:00:02||1        |  2023-03-03 12:00:01|

可以很明顯的發現,刪除訂單【ID=4】的數據之后,頁面查詢結果直接到訂單【ID=2】了,直接跳過訂單【ID=3】了,也就是說訂單【ID=3】的數據展示,丟失了!ZjO28資訊網——每日最新資訊28at.com

圖片圖片ZjO28資訊網——每日最新資訊28at.com

總結下來,結論如下!ZjO28資訊網——每日最新資訊28at.com

  • 當新增某條數據之后,通過常規的分頁查詢,列表會出現數據重復的現象;
  • 當刪除某條數據之后,通過常規的分頁查詢,列表會出現數據丟失的現象;

那怎么解決以上的問題呢?辦法如下!ZjO28資訊網——每日最新資訊28at.com


ZjO28資訊網——每日最新資訊28at.com

03、解決方案

針對上面所說的分頁查詢方式,我們需要做一些調整,調整辦法如下:ZjO28資訊網——每日最新資訊28at.com

  • 第一步:當查詢出當頁的數據之后,記錄下本次拉取的最后一條數據的排序字段值;當發起下一頁數據查詢的時候,帶上這個參數,服務端通過這個參數做過濾條件
  • 第二步:排序字段值不能出現重復,比如創建時間不能出現重復

以上面的新增為例,詳細的實踐過程如下:ZjO28資訊網——每日最新資訊28at.com

-- 發起第一頁查詢select * from tb_order order by create_time desc limit 0,2;-- 第一頁查詢結果|order_id |   create_time       ||5        |  2023-03-03 12:00:05||4        |  2023-03-03 12:00:04|-- 新增一條訂單數據INSERT INTO `tb_order` (`order_id`, `create_time`) VALUES (6, '2023-03-03 12:00:06');-- 發起第二頁查詢,帶上第一頁查詢的最后一條數據的排序字段值select * from tb_order where create_time < '2023-03-03 12:00:04' order by create_time desc limit 0,2;-- 第二頁查詢結果|order_id |   create_time       ||3        |  2023-03-03 12:00:03||2        |  2023-03-03 12:00:02|

此時的查詢結果正常,符合預期效果!ZjO28資訊網——每日最新資訊28at.com

同樣的,以上面的刪除為例,詳細的實踐過程如下:ZjO28資訊網——每日最新資訊28at.com

-- 發起第一頁查詢select * from tb_order order by create_time desc limit 0,2;-- 第一頁查詢結果|order_id |   create_time       ||5        |  2023-03-03 12:00:05||4        |  2023-03-03 12:00:04|-- 刪除一條訂單數據delete from tb_order where order_id = 4;-- 發起第二頁查詢select * from tb_order where create_time < '2023-03-03 12:00:04' order by create_time desc limit 0,2;-- 第二頁查詢結果|order_id |   create_time       ||3        |  2023-03-03 12:00:03||2        |  2023-03-03 12:00:02|

查詢結果與預期一致,正常!ZjO28資訊網——每日最新資訊28at.com

04、深入思考

  • 選擇的排序字段值出現了重復,怎么辦?

在上面我們提到了,排序字段值不能出現重復的要求,但是現實的情況是,如果以訂單的創建時間來排序,當同一秒多次下單的時候大概率會出現重復,這個時候只能在訂單表里面新增一個排序字段,設置全局唯一索引,內容是以時間為基礎來生成,比如雪花算法,或者自己寫一個基于時間全局自增的算法,確保全局唯一,最重要的是值的長度必須固定,訂單主鍵 ID 的生成規則推薦采用此方式,利用主鍵 ID 來排序效率查詢會非常高!ZjO28資訊網——每日最新資訊28at.com

  • 當出現多個排序字段時,如何處理?

如果是 app 端的查詢,不建議設計多字段排序,因為在多字段排序的環境下,服務端在進行多條件的過濾查詢時,可能會把有效的數據給過濾掉,如果無法避開,盡量將多個排序字段合并到一個排序字段上,保證數據的查詢符合預期。ZjO28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-112722-0.html盤點分頁查詢中遇到的坑!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 是什么導致了,寫入MySQL庫表時間不正確?—— 官網也有Bug!

下一篇: 架構設計的簡單原則,你學會了嗎?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲在线一区二区| 国产日产亚洲精品系列| 久久综合伊人77777蜜臀| 玖玖玖免费嫩草在线影院一区| 免费看亚洲片| 欧美日韩亚洲一区二区| 国产麻豆91精品| 精品动漫一区二区| 99在线精品视频| 久久成人免费网| 欧美成年人视频网站| 欧美日韩直播| 黄色精品在线看| 夜夜嗨av色一区二区不卡| 欧美一区高清| 欧美日韩999| 韩国亚洲精品| 亚洲一区二区三区中文字幕| 麻豆成人av| 国产精品入口夜色视频大尺度| 亚洲第一页在线| 亚洲欧美第一页| 欧美高清视频在线观看| 国产精品一区在线观看| 亚洲日本一区二区| 欧美在线地址| 欧美三级精品| 亚洲国产黄色| 欧美在线二区| 欧美日韩中文字幕日韩欧美| 在线观看日韩av先锋影音电影院| 亚洲一区二区黄| 欧美国产日韩一区二区在线观看| 国产日韩欧美综合一区| 99精品视频免费| 老牛影视一区二区三区| 国产精品外国| 夜夜嗨av一区二区三区网页| 久久久亚洲高清| 国产精品一二三| 一区二区成人精品| 免费黄网站欧美| 国产综合欧美在线看| 亚洲一区二区三区三| 欧美激情综合五月色丁香| 国产一区在线观看视频| 亚洲综合精品一区二区| 欧美人成网站| 亚洲欧洲视频在线| 久久这里只精品最新地址| 国产日产高清欧美一区二区三区| 亚洲视频一区二区免费在线观看| 欧美国产综合| 亚洲黄色小视频| 久久综合福利| 韩国av一区二区三区在线观看| 亚洲欧美色一区| 国产精品vvv| 99re6这里只有精品| 欧美福利视频网站| 在线欧美亚洲| 久久嫩草精品久久久久| 国内外成人免费激情在线视频网站| 午夜天堂精品久久久久| 国产精品区二区三区日本| 亚洲午夜视频在线| 欧美亚洲动漫精品| 亚洲丝袜av一区| 欧美色一级片| 亚洲午夜激情网站| 欧美新色视频| 亚洲一区二区在线观看视频| 国产精品国产精品| 亚洲一区三区在线观看| 国产精品家庭影院| 亚洲男人的天堂在线| 国产精品日日摸夜夜摸av| 亚洲综合第一页| 国产精品人人做人人爽| 亚洲欧美一区二区三区久久| 国产精品日本| 香蕉乱码成人久久天堂爱免费| 国产乱肥老妇国产一区二| 性高湖久久久久久久久| 国产日韩欧美不卡在线| 久久国产精品黑丝| 加勒比av一区二区| 免费av成人在线| 亚洲精品在线看| 欧美日韩一区自拍| 亚洲欧美精品一区| 国产亚洲精品久久久久久| 久久久久久久激情视频| 1024国产精品| 欧美激情第4页| 在线亚洲欧美专区二区| 国产精品亚洲人在线观看| 午夜免费日韩视频| 国产永久精品大片wwwapp| 久久久精品国产免费观看同学| 精品成人国产| 欧美黄色影院| 亚洲夜晚福利在线观看| 国产精品一国产精品k频道56| 欧美一区二区三区在线看| 韩日欧美一区二区| 欧美国产激情二区三区| 一本色道久久| 国产精品美女久久久浪潮软件| 欧美中文字幕不卡| 亚洲国产欧美不卡在线观看 | 欧美福利视频在线观看| av成人黄色| 国产日韩精品一区二区三区| 久久露脸国产精品| 亚洲精选在线| 国产精品嫩草久久久久| 久久夜色精品国产噜噜av| 亚洲精品在线免费| 国产麻豆综合| 欧美ab在线视频| 亚洲无线观看| 国内精品一区二区三区| 欧美激情视频在线播放| 亚洲欧美区自拍先锋| 亚洲大黄网站| 国产精品国产| 美国十次了思思久久精品导航| 中文精品视频| 精品91在线| 国产精品yjizz| 久久综合给合久久狠狠色| 制服丝袜激情欧洲亚洲| 激情欧美国产欧美| 欧美三级视频| 久久久夜夜夜| 亚洲男人影院| 亚洲日本在线观看| 国产性色一区二区| 欧美日韩一区三区四区| 久久久久久久久久久成人| 中文在线一区| 亚洲国产女人aaa毛片在线| 国产欧美激情| 欧美日韩午夜激情| 久久综合色天天久久综合图片| 亚洲天堂激情| 亚洲激情图片小说视频| 国产亚洲一区精品| 欧美三区美女| 欧美成人中文字幕在线| 欧美一级久久久| 一区二区国产日产| 亚洲高清视频中文字幕| 国产日韩高清一区二区三区在线| 欧美精品一区三区| 久久这里只有精品视频首页| 午夜欧美大片免费观看 | 在线一区视频| 亚洲国产成人精品女人久久久 | 亚洲国产精品第一区二区三区| 国产精品久久久久久久久搜平片| 欧美成人午夜免费视在线看片| 久久成人18免费网站| 国产精品99久久久久久人| 亚洲国产一区二区三区在线播| 国产网站欧美日韩免费精品在线观看| 欧美调教vk| 欧美日韩成人综合在线一区二区| 蜜臀a∨国产成人精品| 久久国产精品高清| 羞羞漫画18久久大片| 一区二区三区欧美日韩| 亚洲欧洲精品一区二区精品久久久| 国产在线观看精品一区二区三区| 国产精品美女久久久久aⅴ国产馆| 欧美日韩精品久久| 欧美精品一级| 欧美国产日本在线| 看欧美日韩国产| 久久久亚洲国产天美传媒修理工 | 欧美色欧美亚洲另类二区| 欧美精品二区三区四区免费看视频| 久久在线免费观看| 久久久xxx| 久久精品人人做人人综合 | 国产精品成人免费| 欧美色视频日本高清在线观看| 欧美国产精品人人做人人爱| 美女精品在线观看| 久久综合色8888| 老色鬼久久亚洲一区二区| 麻豆freexxxx性91精品| 久久综合成人精品亚洲另类欧美| 久久久视频精品| 老牛影视一区二区三区| 久久综合网络一区二区| 美女露胸一区二区三区| 狂野欧美激情性xxxx| 米奇777在线欧美播放| 欧美成年视频| 欧美人交a欧美精品| 欧美性生交xxxxx久久久| 国产精品久久久久99|