国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

百億級數據分庫分表后怎么分頁查詢
2022-09-26   碼猿技術專欄

隨著數據的日益增多,在架構上不得不分庫分表,提高系統的讀寫速度,但是這種架構帶來的問題也是很多,這篇文章就來講一講跨庫/表分頁查詢的解決方案。

架構背景

筆者曾經做過大型的電商系統中的訂單服務,在企業初期時業務量很少,單庫單表基本扛得住,但是隨著時間推移,數據量越來越多,訂單服務在讀寫的性能上逐漸變差,架構組也嘗試過各種優化方案,比如前面介紹過的:、各種方案。雖說提升一些性能,但是在每日百萬數據增長的情況下,也是杯水車薪。

最終經過架構組的討論,選擇了分庫分表;至于如何拆分,分片鍵如何選擇等等細節不是本文重點,不再贅述。

在分庫分表之前先來拆解一下業務需求:。

  • C端用戶需要查詢自己所有的訂單。
  • 后臺管理員、客服需要查詢訂單信息(根據訂單號、用戶信息.....查詢)。
  • B端商家需要查詢自己店鋪的訂單信息。

針對以上三個需求,判斷下優先級,當然首先需要滿足C端用戶的業務場景,因此最終選用了uid作為了shardingKey。

當然選擇uid作為shardingKey僅僅滿足了C端用戶的業務場景,對于后臺和C端用戶的業務場景如何做呢?很簡單,只需要將數據異構一份存放在ES或者HBase中就可以實現,比較簡單,不再贅述。

假設將訂單表根據hash(uid%2+1)拆分成了兩張表,如下圖:

假設現在需要根據訂單的時間進行排序分頁查詢(這里不討論shardingKey路由,直接全表掃描),在單表中的SQL如下:

 
select * from t_order order by time asc limit 5,5;
  • 1.

這條SQL非常容易理解,就是翻頁查詢第2頁數據,每頁查詢5條數據,其中offest=5

假設現在t_order_1和t_order_2中的數據如下:

以上20條數據從小到大的排序如下:

t_order_1中對應的排序如下:

t_order_2中對應的排序如下:

那么單表結構下最終結果只需要查詢一次,結果如下:

分表的架構下如何分頁查詢呢?下面介紹幾種方案:

1. 全局查詢法

在數據拆分之后,如果還是上述的語句,在兩個表中直接執行,變成如下兩條SQL:

 
select * from t_order_1 order by time asc limit 5,5;

select * from t_order_2 order by time asc limit 5,5;
  • 1.
  • 2.
  • 3.

將獲取的數據然后在內存中再次進行排序,那么最終的結果如下:

可以看到上述的結果肯定是不對的。

所以正確的SQL改寫成如下:

 
select * from t_order_1 order by time asc limit 0,10;

select * from t_order_2 order by time asc limit 0,10;
  • 1.
  • 2.
  • 3.

也就是說,要在每個表中將前兩頁的數據全部查詢出來,然后在內存中再次重新排序,最后從中取出第二頁的數據,這就是全局查詢法

該方案的缺點非常明顯:

隨著頁碼的增加,每個節點返回的數據會增多,性能非常低。

服務層需要進行二次排序,增加了服務層的計算量,如果數據過大,對內存和CPU的要求也非常高。

不過這種方案也有很多的優化方法,比如Sharding-JDBC中就對此種方案做出了優化,采用的是,有興趣的可以自行去了解一下。

2. 禁止跳頁查詢法

數據量很大時,可以禁止跳頁查詢,只提供下一頁的查詢方法,比如APP或者小程序中的下拉刷新,這是一種業務折中的方案,但是卻能極大的降低業務復雜度。

比如第一頁的排序數據如下:

那么查詢第二頁的時候可以將上一頁的最大值作為查詢條件,此時的兩個表中的SQL改寫如下:

 
select * from t_order_1 where time>1664088392 order by time asc limit 5;

select * from t_order_2 time>1664088392 order by time asc limit 5;
  • 1.
  • 2.
  • 3.

然后同樣是需要在內存中再次進行重新排序,最后取出前5條數據

但是這樣的好處就是不用返回前兩頁的全部數據了,只需要返回一頁數據,在頁數很大的情況下也是一樣,在性能上的提升非常大

此種方案的缺點也是非常明顯:不能跳頁查詢,只能一頁一頁的查詢,比如說從第一頁直接跳到第五頁,因為無法獲取到第四頁的最大值,所以這種跳頁查詢肯定是不行的。

3. 二次查詢法

以上兩種方案或多或少的都有一些缺點,下面介紹一下二次查詢法,這種方案既能滿足性能要求,也能滿足業務的要求,不過相對前面兩種方案理解起來比較困難。

還是上面的SQL:

 
select * from t_order order by time asc limit 5,5;
  • 1.

(1)SQL改寫

第一步需要對上述的SQL進行改寫:

 
select * from t_order order by time asc limit 2,5;
  • 1.

注意:原先的SQL的offset=5,稱之為全局offset,這里由于是拆分成了兩張表,因此改寫后的offset=全局offset/2=5/2=2。

最終的落到每張表的SQL如下:

 
select * from t_order_1 order by time asc limit 2,5;

select * from t_order_2 order by time asc limit 2,5;
  • 1.
  • 2.
  • 3.

執行后的結果如下:

下圖中紅色部分則為最終結果:

(2)返回數據的最小值

t_order_1:5條數據中最小值為:

t_order_1:5條數據中最小值為:

那么兩張表中的最小值為,記為,來自t_order_2這張表,這個過程只需要比較各個分庫第一條數據,時間復雜度很低。

(3)查詢二次改寫

第二次的SQL改寫也是非常簡單,使用between語句,起點就是第2步返回的最小值time_min,終點就是每個表中在第一次查詢時的最大值。

t_order_1這張表,第一次查詢時的最大值為1664088581,則SQL改寫后:

 
select * from t_order_1 where time between $time_min and 1664088581 order by time asc;
  • 1.

t_order_2這張表,第一次查詢時的最大值為1664088481,則SQL改寫后:

 
select * from t_order_2 where time between $time_min and 1664088481 order by time asc;
  • 1.

此時查詢的結果如下(紅色部分):

上述例子只是數據巧合導致第2步的結果和第3步的結果相同,實際情況下一般第3步的結果會比第2步的結果返回的數據會多。

(4)在每個結果集中虛擬一個time_min記錄,找到time_min在全局的offset。

在每個結果集中虛擬一個time_min記錄,找到time_min在全局的offset,下圖藍色部分為虛擬的time_min,紅色部分為第2步的查詢結果集。

因為第1步改后的SQL的offset為2,所以查詢結果集中每個分表的第一條數據offset為3(2+1);

t_order_1中的第一條數據為,這里的offset為3,則向上推移一個找到了虛擬的time_min,則offset=2。

t_order_2中的第一條數據就是time_min,則offset=3。

那么此時的time_min的全局offset=2+3=5。

(5) 查找最終數據

找到了time_min的最終全局offset=5之后,那么就可以知道排序的數據了。

將第2步獲取的兩個結果集在內存中重新排序后,結果如下:

現在time_min也就是的offset=5,那么原先的SQL:select * from t_order order by time asc limit 5,5;的結果顯而易見了,向后推移一位,則結果為:

剛好符合之前的結果,說明二次查詢的方案沒問題

這種方案的優點:可以精確的返回業務所需數據,每次返回的數據量都非常小,不會隨著翻頁增加數據的返回量。

缺點也是很明顯:需要進行兩次查詢

總結

本篇文章中介紹了分庫分表后的分頁查詢的三種方案:

全局查詢法:這種方案最簡單,但是隨著頁碼的增加,性能越來越低。

禁止跳頁查詢法:這種方案是在業務上更改,不能跳頁查詢,由于只返回一頁數據,性能較高。

二次查詢法:數據精確,查詢的數據較少,不會隨著翻頁增加數據的返回量,性能較高。

熱詞搜索:數據分庫

上一篇:九種常用數據分析方法!
下一篇:最后一頁

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
国产女主播一区| 视频一区免费在线观看| 欧美日韩国产综合一区二区三区| 午夜精品久久久久久久久久久 | 裸体一区二区三区| 欧美吞精做爰啪啪高潮| 亚洲人成在线播放网站岛国| 久久国产精品免费| 日韩欧美国产综合| 蜜桃一区二区三区在线观看| 欧美精品日日鲁夜夜添| 午夜精品爽啪视频| 日韩欧美一区二区久久婷婷| 日本在线观看不卡视频| 91精彩视频在线| 亚洲精品ww久久久久久p站| 成人性生交大片免费看中文| 久久久久久97三级| 国产成人av福利| 国产精品伦理在线| 一本色道亚洲精品aⅴ| 亚洲美女屁股眼交3| 日本高清免费不卡视频| 亚洲国产wwwccc36天堂| 欧美三级电影在线看| 国产精品久久久久久久久动漫| 蜜臀精品久久久久久蜜臀| 日韩欧美国产系列| 国产一区二区在线观看免费| 久久久夜色精品亚洲| 成人性视频网站| 亚洲中国最大av网站| 日韩一区二区在线观看视频播放| 久久超碰97人人做人人爱| 久久久久88色偷偷免费| 99re视频这里只有精品| 亚洲高清不卡在线| 精品久久人人做人人爽| 丁香婷婷综合色啪| 亚洲免费av观看| 欧美一激情一区二区三区| 国产精品一区一区三区| 亚洲另类春色国产| 日韩精品一区二区三区在线播放| 国产伦精品一区二区三区视频青涩 | 91精品在线观看入口| 国产不卡视频在线观看| 一区二区三区中文在线| 欧美xxxxxxxxx| 色综合久久综合中文综合网| 免费不卡在线观看| 中文一区在线播放| 欧美一二三四区在线| 成人午夜免费av| 日本三级韩国三级欧美三级| 国产精品久久久久久亚洲毛片| 欧美中文一区二区三区| 国产成人亚洲综合a∨婷婷| 亚洲国产成人av| 日韩一区欧美一区| 亚洲精品在线三区| 欧美日本韩国一区二区三区视频| 国产乱码精品1区2区3区| 日韩欧美123| 91黄色免费观看| 成人白浆超碰人人人人| 麻豆成人免费电影| 天堂成人免费av电影一区| 日本一区二区三区久久久久久久久不| 欧美人牲a欧美精品| 91在线观看高清| 成人网页在线观看| 久久99久久精品欧美| 亚洲一区二区欧美激情| 亚洲天天做日日做天天谢日日欢 | 蜜桃免费网站一区二区三区| 亚洲精品欧美综合四区| 国产欧美日韩亚州综合 | 亚洲欧美偷拍另类a∨色屁股| 日韩欧美国产系列| 日韩一区二区三区在线观看| 欧美亚洲综合一区| 日本韩国一区二区| 99精品欧美一区| 成人的网站免费观看| 国产揄拍国内精品对白| 美女视频黄免费的久久 | 国产亚洲午夜高清国产拍精品| 欧美一区午夜视频在线观看| 欧美性猛交xxxxxx富婆| 在线视频亚洲一区| 欧美三级三级三级爽爽爽| 91传媒视频在线播放| 色av成人天堂桃色av| 在线免费观看一区| 色婷婷亚洲综合| 欧美中文字幕不卡| 欧美特级限制片免费在线观看| 日本道色综合久久| 欧美日韩中文一区| 777a∨成人精品桃花网| 日韩网站在线看片你懂的| 欧美电影精品一区二区| 久久精品网站免费观看| 国产欧美日韩精品a在线观看| 久久久亚洲精品一区二区三区| 国产欧美一区二区精品性色| 成人av小说网| 一本大道av伊人久久综合| 欧美日韩亚洲国产综合| 日韩色视频在线观看| 国产欧美一区二区三区沐欲| 综合色天天鬼久久鬼色| 亚洲自拍都市欧美小说| 精品综合久久久久久8888| 成人免费视频一区| 91精品办公室少妇高潮对白| 91麻豆精品国产91久久久使用方法| 精品美女一区二区| 国产精品久久久久久久久免费樱桃| 亚洲精品视频在线观看网站| 日本不卡不码高清免费观看| 成人av先锋影音| 欧美午夜精品一区二区蜜桃| 久久综合九色综合欧美亚洲| 亚洲精品精品亚洲| 精品国产乱码久久久久久久久 | 99久久综合99久久综合网站| 国产黄色精品网站| 亚洲三级在线免费观看| 一区二区三区免费网站| 怡红院av一区二区三区| 亚洲123区在线观看| 悠悠色在线精品| 麻豆一区二区99久久久久| 亚洲精选一二三| 久久99国产精品免费| av电影在线观看不卡| 这里只有精品免费| 亚洲丝袜自拍清纯另类| 极品美女销魂一区二区三区 | 久久综合九色综合欧美亚洲| 一区二区三区免费网站| 国产suv精品一区二区6| 91精品欧美福利在线观看| 国产精品毛片久久久久久| 美女网站在线免费欧美精品| 色婷婷久久综合| 国产人成一区二区三区影院| 天天免费综合色| 色94色欧美sute亚洲线路一ni| 国产日韩欧美a| 激情久久五月天| 日韩一区二区三区高清免费看看| 亚洲精品va在线观看| 成人免费视频app| 久久久综合激的五月天| 久久超碰97中文字幕| 91麻豆精品国产91久久久久久| 亚洲国产精品人人做人人爽| 色综合久久综合网欧美综合网| 国产精品久久久久aaaa樱花 | 亚洲h动漫在线| 91尤物视频在线观看| 中文字幕不卡在线| 国产一区二区三区最好精华液| 日韩欧美一区二区视频| 午夜精品成人在线视频| 日本精品视频一区二区三区| 亚洲天堂中文字幕| 99re这里都是精品| 亚洲欧美日韩一区| 91丨九色丨蝌蚪丨老版| 亚洲女爱视频在线| 91色|porny| 一区二区三区不卡在线观看| 91官网在线免费观看| 一区二区三区日韩在线观看| 成人aa视频在线观看| 国产精品嫩草影院av蜜臀| 国产传媒欧美日韩成人| 久久九九久久九九| 丁香网亚洲国际| 国产精品高潮呻吟| 91美女片黄在线观看| 亚洲午夜视频在线观看| 欧美一区二区网站| 韩国v欧美v亚洲v日本v| 国产精品久久久一区麻豆最新章节| 91在线视频官网| 亚洲第四色夜色| 日韩一区二区三区四区 | 欧美激情一区二区三区在线| gogo大胆日本视频一区| 亚洲综合无码一区二区| 欧美一区二区三区四区在线观看 | 欧美变态tickle挠乳网站| 床上的激情91.| 亚洲国产裸拍裸体视频在线观看乱了 | 国产精品伦一区|