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

面試官:1億數(shù)據(jù)分庫分表,分頁查詢應(yīng)如何設(shè)計?

數(shù)據(jù)庫 其他數(shù)據(jù)庫
從最初的全局查詢,到禁用跳頁、二次查詢、引入中間表,再到借助外部存儲,可以看到分頁查詢在分庫分表架構(gòu)下并不是一個簡單的 SQL 問題,而是牽涉到性能、數(shù)據(jù)一致性、交互設(shè)計等多維度的系統(tǒng)性挑戰(zhàn)。沒有放之四海而皆準的最佳方案,關(guān)鍵在于理解業(yè)務(wù)場景的需求邊界,然后在可接受的性能與復(fù)雜度之間做出取舍。

大家好,我是秀才。在后端技術(shù)面試,尤其是針對高級工程師或架構(gòu)師的崗位,分庫分表是一個核心考察點。資深面試官往往不會直接問我們分庫分表策略是怎么設(shè)計的,而是會基于此提出一個極具挑戰(zhàn)性的場景問題:“在億級別數(shù)據(jù)量且已實施分庫分表的背景下,分頁查詢應(yīng)如何設(shè)計?常見的性能瓶頸有哪些?”

這個問題并不是單純考察分頁實現(xiàn),而是旨在評估工程師對于分布式數(shù)據(jù)處理的理解深度、多方案橫向?qū)Ρ鹊臋?quán)衡能力,以及在復(fù)雜約束下進行架構(gòu)設(shè)計的綜合能力。它能夠精確地衡量出一位工程師在分布式系統(tǒng)領(lǐng)域的知識深度與廣度。

接下來秀才就對這個問題進行系統(tǒng)性解構(gòu),從根源探究其技術(shù)挑戰(zhàn),并梳理出一套完整的架構(gòu)解決方案,希望能對大家在工作實踐和面試中有所幫助。

1. 分庫分表的常見策略

在深入探討分頁查詢方案這一問題之前,我們必須首先對分庫分表架構(gòu)下的基礎(chǔ)組件與核心概念建立一個清晰的共識。這里我們主要討論水平分表的解決方案。水平分表表結(jié)構(gòu)一般不會變更。要探索的是如何將海量數(shù)據(jù)分片存儲到不同的表中以實現(xiàn)高性能。

1.1 水平分片策略

通常,我們會采用以下幾種策略將數(shù)據(jù)打散到不同的庫表中:

  1. 哈希取模:這是最常見的方式,比如根據(jù)用戶ID進行哈希計算后,對分庫(或分表)的數(shù)量取模,從而決定數(shù)據(jù)落在哪個節(jié)點。例如,將訂單數(shù)據(jù)按user_id % 16分散到16個表中。

11

  • 優(yōu)點:數(shù)據(jù)分布相對均勻,不容易產(chǎn)生數(shù)據(jù)傾斜和熱點問題。
  • 缺點:范圍查詢極不友好。比如,要查詢某一段時間內(nèi)創(chuàng)建的所有訂單,就必須掃描所有分片,因為無法從時間維度定位到具體的分片。
  1. 范圍劃分:按照某個字段的區(qū)間來切分數(shù)據(jù)。最典型的就是按時間范圍,例如,每個月的訂單數(shù)據(jù)存放在一張獨立的表中(orders_202401orders_202402...)。

22

  • 優(yōu)點:范圍查詢非常高效,天然支持按時間等維度的冷熱數(shù)據(jù)分離。
  • 缺點:容易產(chǎn)生熱點問題。例如,在訂單場景下,所有新的寫入請求都會集中在最新的那張表上,對數(shù)據(jù)庫造成瞬時高壓。
  1. 路由中間表:建立一個獨立的映射關(guān)系表,用于記錄某條數(shù)據(jù)(如主鍵)具體存儲在哪個物理庫表中。這種方式雖然靈活,但多了一次額外查詢,增加了架構(gòu)的復(fù)雜度。查詢時需要先訪問路由表,再根據(jù)路由信息訪問目標分片。

33

這些策略并不是互斥,實際架構(gòu)中往往是組合使用,例如先按用戶ID哈希分庫,庫內(nèi)再按時間范圍分表。

1.2 分庫分表的實現(xiàn)方式

實現(xiàn)數(shù)據(jù)分片的邏輯,通常由分庫分表中間件來完成,它們主要有三種架構(gòu)形態(tài):

  • SDK 模式:以 jar 包的形式被業(yè)務(wù)應(yīng)用直接引入。優(yōu)點是性能損耗最低,因為路由、聚合等操作都在業(yè)務(wù)應(yīng)用進程內(nèi)完成,沒有額外的網(wǎng)絡(luò)調(diào)用。缺點是與特定編程語言強耦合(Java的SDK無法給Go用),且版本升級時需要協(xié)調(diào)所有依賴方,維護成本較高,容易形成“胖客戶端”

44

  • Proxy 模式:以一個獨立的代理服務(wù)存在,對業(yè)務(wù)應(yīng)用偽裝成一個數(shù)據(jù)庫。應(yīng)用所有的SQL請求都先發(fā)給Proxy,由Proxy解析、路由、執(zhí)行,最后合并結(jié)果返回。優(yōu)點是與語言無關(guān),對業(yè)務(wù)透明。缺點是多了一層網(wǎng)絡(luò)開銷,且Proxy自身容易成為性能瓶頸和單點故障。為了保證Proxy的高可用,還需要額外部署如LVS、Nginx等負載均衡和Keepalived等高可用組件,增加了運維的復(fù)雜度。

55

  • Sidecar 模式:這是一種在服務(wù)網(wǎng)格(Service Mesh)架構(gòu)下興起的形態(tài),將分庫分表的能力下沉到與業(yè)務(wù)應(yīng)用一同部署的Sidecar中。它結(jié)合了SDK的低耦合和Proxy的語言無關(guān)性,但目前市面上尚未有非常成熟的開源產(chǎn)品。

66

在這三種形態(tài)中,SDK 模式的性能最好,但缺點是與具體編程語言綁定緊密。比如,Java 提供的 ShardingSphere jar 包無法直接被 Go 語言調(diào)用。  相比之下,Proxy 模式的性能最弱,因為所有查詢請求都會集中經(jīng)過它,極易成為系統(tǒng)瓶頸。如果只部署單節(jié)點 Proxy,還存在單點故障的風險。不過它的優(yōu)勢也很明顯:與語言無關(guān),任何技術(shù)棧的業(yè)務(wù)都可以通過同一個 Proxy 使用分庫分表能力。而且 Proxy 偽裝成普通數(shù)據(jù)庫實例后,業(yè)務(wù)只需替換數(shù)據(jù)源配置,就能在單庫單表與分庫分表之間平滑切換,幾乎無需額外改造

2. 全局查詢法

理解了這些背景,我們就能清晰地認識到,為什么一個簡單的LIMIT offset, size分頁查詢,在分庫分表環(huán)境下會面臨嚴峻的挑戰(zhàn)。其根本原因在于,數(shù)據(jù)被物理隔離在不同分片,單體數(shù)據(jù)庫的offsetsize語義在分布式全局視角下已經(jīng)失效,必須引入跨節(jié)點的排序與數(shù)據(jù)聚合機制。

針對這個問題,一種直接的思路是:將查詢請求廣播至所有相關(guān)分片,獲取各分片的數(shù)據(jù)后,在中間件層進行全局排序,最后根據(jù)分頁參數(shù)截取目標數(shù)據(jù)返回。這就是全局查詢法。

假設(shè)我們有一個分頁查詢需求:

SELECT * FROM order_tab ORDER BY id LIMIT 4 OFFSET 2;

假設(shè)訂單數(shù)據(jù)按照user_id % 2被分到了order_tab_0order_tab_1兩張表中。此查詢的復(fù)雜性根源于數(shù)據(jù)在分片中的不確定性分布。例如,全局偏移量為2、數(shù)量為4的這批數(shù)據(jù),可能存在以下幾種極端情況:

  • 所有目標數(shù)據(jù)(包括被OFFSET跳過的數(shù)據(jù)和最終返回的數(shù)據(jù))全部位于order_tab_0中。

77

  • OFFSET跳過的2條數(shù)據(jù)位于order_tab_0,而最終需要的4條數(shù)據(jù)位于order_tab_1。

88

  • 偏移量和目標數(shù)據(jù)均勻或不均勻地散落在兩個分片中。

99

為應(yīng)對這種不確定性,并確保結(jié)果的完備性,中間件必須采用一種“寧可錯撈,不可漏過”的策略。它會將原始SQL改寫為對所有分片都有效的查詢。

改寫的邏輯是:LIMIT size OFFSET offset -> LIMIT size + offset OFFSET 0。

-- 改寫后的SQL,下發(fā)到order_tab_0和order_tab_1
SELECT * FROM order_tab ORDER BY id LIMIT 6 OFFSET 0; -- (4 + 2 = 6)

中間件會從兩個分片中各自取出前6條數(shù)據(jù),然后在內(nèi)存中進行歸并排序,最后再從排序后的結(jié)果集中,跳過前8條,取出4條數(shù)據(jù)作為最終結(jié)果返回給客戶端。

應(yīng)對面試知道方法是遠遠不夠的,在介紹完這種方法之后,一定要分析這種方案的缺點,為引出我們后續(xù)的優(yōu)化方案做準備。你可以這樣來分析:“這種方案雖然能保證數(shù)據(jù)的絕對準確,但其性能隱患是巨大的,尤其是在深度分頁(OFFSET值很大)的場景下主要有以下三大性能損耗?!?/span>

  • 網(wǎng)絡(luò)開銷劇增:為了量化其網(wǎng)絡(luò)開銷,我們進行如下分析。假設(shè)查詢LIMIT 10 OFFSET 10000,在單庫中,數(shù)據(jù)庫只需傳輸10條記錄。但在分庫分表場景下,假設(shè)我們有10個分片,每個分片都需要傳輸10000 + 10條記錄到中間件。如果每條記錄是1KB,那么總傳輸量將是 10 * 10010 * 1KB 約等于 97.7MB。而真正有用的數(shù)據(jù)只有 10 * 1KB = 10KB。為了獲取10KB的有效數(shù)據(jù),產(chǎn)生了近100MB的無效網(wǎng)絡(luò)傳輸,資源利用效率極低。


  • 內(nèi)存消耗巨大:中間件需要將這近100MB的數(shù)據(jù)全部加載到內(nèi)存中進行排序。隨著分頁越深,所需內(nèi)存越大,極易引發(fā)OOM(內(nèi)存溢出),尤其是在Proxy模式下,會導致整個代理服務(wù)集群響應(yīng)緩慢甚至崩潰。


  • CPU 負載過高:排序本身是CPU密集型操作。當數(shù)據(jù)量巨大時,會導致中間件節(jié)點的CPU負載急劇升高,成為整個系統(tǒng)的性能瓶頸。

介紹完缺陷之后還可以補充一個優(yōu)化點以展示對問題理解的深度。

“雖然該方案存在明顯瓶頸,但在工程實踐中,可以利用歸并排序的特性進行優(yōu)化。由于從各分片獲取的數(shù)據(jù)本身已有序,無需將所有數(shù)據(jù)一次性加載到內(nèi)存。可采用多路歸并(Multiway Merge Sort)算法,維護一個大小為N(分片數(shù))的最小堆(Min-Heap),堆中存放每個分片當前待處理的記錄。每次從堆頂取出全局最小的記錄,然后將該記錄所在分片的下一條記錄補充到堆中并調(diào)整堆。這個過程可以流式進行,顯著降低內(nèi)存消耗,直到獲取到size條目標數(shù)據(jù)為止。”

1010

這個補充回答,能體現(xiàn)出對問題細節(jié)的深入思考。但這依然沒有從根本上解決深度分頁時數(shù)據(jù)傳輸量過大的問題,因此我們需要探索更高效的架構(gòu)方案。

3. 面試實戰(zhàn)指南

既然全局聚合排序方案存在性能瓶頸,這就需要通過更優(yōu)化的設(shè)計來達成目標。這也是面試的時候凸顯你個人能力的地方,這里主要有以下三種方案可以跟面試官討論

3.1 禁用跳頁查詢法

這是目前業(yè)界在移動端無限滾動(Infinite Scroll)等場景下最主流、最高效的方案。其核心思想是:在產(chǎn)品設(shè)計上約束分頁行為,放棄跳轉(zhuǎn)到任意頁的功能,只允許用戶逐頁向后加載。也就是通過犧牲一定的用戶體驗來保證高性能

在這種交互模式下,我們不再需要OFFSET。取而代之的是,每次請求下一頁數(shù)據(jù)時,客戶端都需要帶上上一頁最后一條記錄的排序鍵的值。

假設(shè)我們按ID升序分頁,每頁50條:

  • 第一頁查詢
-- 首次加載,沒有max_id
SELECT * FROM order_tab ORDER BY id LIMIT 50;

客戶端拿到這50條數(shù)據(jù)后,記錄下最后一條數(shù)據(jù)的ID,比如是1050。

  • 第二頁查詢
-- 加載下一頁時,從上一頁的終點繼續(xù)
SELECT * FROM order_tab WHERE id > 1050 ORDER BY id LIMIT 50;

這樣,無論翻到多少頁,SQL語句中的LIMIT部分始終是固定的50,而OFFSET永遠是0。查詢性能極其穩(wěn)定,且與分頁深度完全無關(guān)。如果排序鍵是降序的,比如按時間倒序,那么查詢條件就變?yōu)?nbsp;WHERE create_time < last_create_time

處理復(fù)合排序鍵:如果排序規(guī)則是 ORDER BY create_time DESC, id DESC,WHERE條件就需要更嚴謹?shù)倪壿媮硖幚?,以避免排序謬誤:

WHERE (create_time < last_create_time) OR (create_time = last_create_time AND id < last_id)

這個細節(jié)非常關(guān)鍵,能體現(xiàn)出對問題的深入思考和方案的完備性。還是老規(guī)矩,介紹完方案之后一定要分析其優(yōu)缺點

優(yōu)點:性能極高且穩(wěn)定,實現(xiàn)簡單,完美契合移動端的交互習慣。

缺點:犧牲了用戶自由跳轉(zhuǎn)頁碼的功能。

這個方案是解決這類場景的關(guān)鍵技術(shù)之一,雖然看似犧牲了一定的用戶體驗,但大多數(shù)情況下用戶卻還是可以接受的。這種思想在架構(gòu)設(shè)計中具有重要價值,它展現(xiàn)了如何通過優(yōu)化產(chǎn)品交互來規(guī)避復(fù)雜的技術(shù)難題,體現(xiàn)了技術(shù)方案與業(yè)務(wù)場景深度結(jié)合的架構(gòu)思維。

3.2 二次查詢法(亮點方案一)

這個時候面試官為了考察你的技術(shù)深度,可能會接著挑戰(zhàn)

“如果業(yè)務(wù)場景(例如后臺管理系統(tǒng))在產(chǎn)品設(shè)計上必須要求精確的跳頁功能,怎么辦?

這個時候就輪到我們的第一個亮點方案出場了——二次查詢法。這個方案的邏輯較為復(fù)雜,你如果能在面試中通過一些示例簡潔的講清楚,將成為一個重要的技術(shù)亮點。

我們用一個例子來拆解其步驟,假設(shè)一個DB中保存了用戶年齡數(shù)據(jù),從1歲到30歲,共有30條記錄。如果需要查詢這些數(shù)據(jù),可能會執(zhí)行以下SQL語句:

select * from T order by age limit 5 offset 10

那么會返回以下紅色標識數(shù)據(jù),即[11,15],請記住此結(jié)果,下面會講解怎么分庫查詢以下結(jié)果

1111

把以上所有數(shù)據(jù)分片存儲到3個分庫中,如下,注意下面數(shù)據(jù)只是用戶屬性年齡,不是分片鍵:

1212

根據(jù)前面分析,在單一數(shù)據(jù)庫中執(zhí)行 LIMIT 5 OFFSET 10 查詢時,返回的結(jié)果是[11-15]。那么,如果在這三個分庫中進行全局查詢 LIMIT 5 OFFSET 10,該如何操作呢?

  • 語句改寫

將以下SQL

select * from T order by age limit 5 offset 10

改寫為:

select * from T order by age limit 5 offset 3

在所有分庫執(zhí)行修改之后的sql,注意,這個 offset 的 3,來自于全局offset的總偏移量 10,除以水平切分數(shù)據(jù)庫個數(shù) 3。

執(zhí)行select * from T order by age limit 5 offset 3,結(jié)果如下(紅色標識數(shù)據(jù)),為了便于理解用淺綠色標識庫表前三條數(shù)據(jù):

1313

  • 找到返回數(shù)據(jù)的最小值

第一個庫,5 條數(shù)據(jù)的 age 最小值是10

第二個庫,5 條數(shù)據(jù)的 age 最小值是 6

第三個庫,5 條數(shù)據(jù)的 age 最小值是 12

1414

三頁數(shù)據(jù)中,只需要比較各個分庫第一條數(shù)據(jù)[10,6,12],因此age最小值來自第二個庫,age_min=6,時間復(fù)雜度很低

  • 查詢二次改寫

第一次改寫的SQL語句是select * from T order by age limit 5 offset 3 第二次要改寫成一個between語句,between的起點是age_min,between的終點是原來每個分庫各自返回數(shù)據(jù)的最大值:

  • 第一個分庫,第一次返回數(shù)據(jù)的最大值是22 所以查詢改寫為
select * from T order by age where age between age_min and 22
  • 第二個分庫,第一次返回數(shù)據(jù)的最大值是20 所以查詢改寫為
select * from T order by age where age between age_min and 20
  • 第三個分庫,第一次返回數(shù)據(jù)的最大值是25 所以查詢改寫為
select * from T order by age where age between age_min and 25

相對于第一次查詢,第二次查詢的條件放寬了,因此第二次查詢會返回比第一次查詢結(jié)果集更多的數(shù)據(jù)。假設(shè)這三個分庫返回的數(shù)據(jù)如下:

15

可以看到:

  • 分庫一的結(jié)果集比第一次查詢多返回了一條數(shù)據(jù),即藍色記錄7。
  • 由于 age_min 是從原來的分庫二獲取的,因此分庫二的返回結(jié)果集與第一次查詢相同,實際上這次查詢可以省略。
  • 分庫三的結(jié)果集比第一次查詢多返回了三條數(shù)據(jù),即深藍色記錄8、9、11。
  • 找到age_min在全局的offset

注:offset表示所查詢的結(jié)果集中前面有多少條數(shù)據(jù)沒有被查詢。

在每個結(jié)果集中虛擬一個age_min記錄,找到age_min在各個分庫的offset,也就是找到age_main在各個分庫中前面有多少條數(shù)據(jù)。

1616

在分庫1中age_min的offset為2,分庫2中age_min的offset為3,分庫3中age_min的offset為0。

所以age_min的全局offset為:2+3+0=5。

  • 查找最終數(shù)據(jù)

既然已經(jīng)確定了全局的 age_min 為偏移量5,因此可以獲得全局的視角。根據(jù)第二次查詢的結(jié)果集。

各分庫二次查詢結(jié)果如下:

分庫1:7、10、14、16、21、22

分庫2:6、13、17、19、20

分庫3:8、9、11、12、15、18、23、25

統(tǒng)一放到list排序后:[6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、22、23、25],得知最小值age_main當前的全局offset為5,即6前面有5條數(shù)據(jù)了,最終結(jié)果要取offset 10 limit 5,即要保證前面有10條數(shù)據(jù)不會被取到,所以偏移量offset要往后再移動5個單位到11,這樣前面就有10條數(shù)據(jù)不會被取到了。查詢的limit為5,然后再向后取5位,那就是[11、12、13、14、15],圖中黃色標識數(shù)據(jù)就是我們要找的結(jié)果集。

1717

3.2.1 二次查詢法的限制條件

雖然二次查詢法在一定程度上能提高跨庫分頁的性能,但是卻有著嚴格的限制條件,這個前提條件就是某1頁的數(shù)據(jù)要均攤到各分表,換句話說就是二次查詢法不太適用于數(shù)據(jù)分布不均勻,比如數(shù)據(jù)大量集中在某一張表,而其他的分表數(shù)據(jù)量少,分段法的分表策略同樣不適用,下面就用實際例子來看一下:

  1. 場景1(分表策略:取模法)

原序列:(1,2,3,4,5,6,7,8),需要取出limit 2,2 ,即:(3,4)

第1次查詢

(1,3,5,7) -> limit 2,2 -> 改寫成 limit 1,2 -> (3,5)

(2,4,6,8) -> limit 2,2 -> 改寫成 limit 1,2 -> (4,6)

最小值min為3

第2次查詢

(1,3,5,7) -> between 3 and 5 -> (3,5)

(2,4,6,8) -> between 3 and 6 -> (4,6)

將第2次查詢的結(jié)果合并:

(3,4,5,6) ->根據(jù)規(guī)則,推算出最小值3的全局的offset為2,不需要向后移動,然后取limit即2個元素 -> (3,4) ,結(jié)果正確。

  • 場景2(分表策略:取模法)

原序列:(1,2,3,4,5,6,7,8),需要取出limit 1,2 ,即:(2,3)

第1次查詢

(1,3,5,7) -> limit 1,2 -> 改寫成 limit 0,2 -> (1,3) --注:因為1/2除不盡,這里向下取整

(2,4,6,8) -> limit 1,2 -> 改寫成 limit 0,2 -> (2,4)

最小值min為1

第2次查詢

(1,3,5,7) -> between 1 and 3 -> (1,3)

(2,4,6,8) -> between 1 and 4 -> (2,4)

將第2次查詢的結(jié)果合并:

(1,2,3,4) -> 根據(jù)規(guī)則,推算出最小值1的全局的offset為0,向后移2位,然后取limit即2個元素 -> (3,4) ,結(jié)果正確。

  • 場景3(分表策略:分段法)

原序列(1,2,3,4,5,6,7,8)->(1,2,3,4),(5,6,7,8)

原序列:(1,2,3,4,5,6,7,8),需要取出limit 2,2 ,即:(3,4)

第1次查詢

(1,2,3,4) -> limit 2,2 -> limit 1,2 -> {2,3} --注:這里就已經(jīng)把正確的數(shù)據(jù)給丟掉了。

(5,6,7,8) -> limit 2,2 -> limit 1,2 -> {6,7} --注:這一段里根本就沒有這一頁的數(shù)據(jù)。

最小值min為2

第2次查詢

(1,2,3,4) -> between 2 and 3 -> {2,3}

(5,6,7,8) -> between 2 and 7 -> {5,6,7}

(2,3,5,6,7) -> (3,5)  根據(jù)規(guī)則,推算出最小值2的全局的offset為1,向后移1為,然后取limit即2個元素 -> (3,5) ,結(jié)果正確這個跟預(yù)期結(jié)果就對不上了。

整體來看,二次查詢法還是相對復(fù)雜的,所以在跟面試官介紹的時候,能用示例來說明很重要,如果有屏幕或者有白紙可以演示的話更好,這樣更容易講清楚。在介紹完方案之后,你可以再總結(jié)一下二次查詢的優(yōu)缺點。

總的來說,二次查詢法通過兩次查詢,犧牲了一定的響應(yīng)時間,換來了分頁的絕對精確性。但是其缺點也很明顯,需要進行兩次數(shù)據(jù)庫查詢,并且有一定的限制,要求數(shù)據(jù)均勻分布,即某一頁的數(shù)據(jù)要均攤到各分表,否則查詢結(jié)果就不精確。它的優(yōu)點就是不會對業(yè)務(wù)造成局限性,每次返回的數(shù)據(jù)量都很有限,不會隨著翻頁增加數(shù)據(jù)的返回量。

3.3 引入中間表(亮點方案二)

中間表方案的核心是“空間換時間”思想。我們創(chuàng)建一個獨立的、未分片的“索引表”或“物化視圖”,該表僅存儲用于排序的字段和主鍵ID。

imageimage

例如,要按更新時間排序,我們的索引表結(jié)構(gòu)可以是 (主鍵, 更新時間, 目標庫)。

當需要分頁查詢時:

  • 先在這個單體的索引表上執(zhí)行分頁查詢,由于是單表,LIMIT OFFSET性能很高。
-- 在索引表上輕松定位
SELECT primary_key, target_db_shard FROM index_table ORDER BY update_time DESC LIMIT 10 OFFSET 100;
  • 拿到目標數(shù)據(jù)的primary_key和它們所在的分片信息后,再通過IN查詢回到各個分片庫中,撈取完整的數(shù)據(jù)詳情。

這個方案有兩個顯著的挑戰(zhàn):數(shù)據(jù)一致性維護和查詢能力的限制。

  • 數(shù)據(jù)一致性:這個方案最大的挑戰(zhàn)在于如何維護索引表與主數(shù)據(jù)表之間的數(shù)據(jù)一致性。

同步雙寫:在業(yè)務(wù)代碼中同時寫入主表和索引表。這會增加業(yè)務(wù)邏輯的復(fù)雜度和響應(yīng)時間,且存在分布式事務(wù)問題。

異步復(fù)制:更優(yōu)化的方式是,通過訂閱數(shù)據(jù)庫的binlog(如使用Canal等工具),異步地將數(shù)據(jù)變更同步到索引表中。這能與業(yè)務(wù)邏輯解耦,但會存在一定的延遲,即數(shù)據(jù)一致性是最終一致性

18

這里也是面試官最容易問的地方,有經(jīng)驗的面試官很可能會追問:“異步更新失敗了怎么辦?”,還是萬變不離其宗,只要失敗,就可以補償。

你可以回答:“我們會引入具備重試與死信隊列(DLQ)的機制。如果多次重試后仍然失敗,則消息進入死信隊列,并觸發(fā)告警,由人工介入進行數(shù)據(jù)校準?!?/span>

  • 查詢能力限制:另一個重要的限制就是查詢能力有限。一個重要的操作限制是,任何過濾條件(WHERE子句)都必須基于索引表中已存在的列。如果用戶需要根據(jù)一個未被物化的字段進行篩選,此方案將失效,除非向索引表添加更多列,但這會增加存儲和維護的成本。

3.4 引入外部存儲

當排序和篩選條件非常復(fù)雜時,以上所有基于關(guān)系型數(shù)據(jù)庫的方案可能都難以應(yīng)對。此時,一個更通用的架構(gòu)選擇是引入外部系統(tǒng)。

  1. 引入搜索引擎:將需要查詢的數(shù)據(jù)(全量或部分字段)通過雙寫或binlog同步的方式,寫入到Elasticsearch這樣的專業(yè)搜索引擎中。分頁、排序、復(fù)雜篩選等查詢請求,全部交由Elasticsearch處理。Elasticsearch基于Lucene構(gòu)建,其倒排索引和分布式聚合能力使其在處理這類需求時具備天然優(yōu)勢。從ES獲取ID后,再回源數(shù)據(jù)庫查詢詳情。這是一種非常成熟的異構(gòu)索引方案。
  2. 引入分布式關(guān)系型數(shù)據(jù)庫:另一種思路是采用NewSQL數(shù)據(jù)庫,如TiDB。TiDB的底層存儲引擎TiKV是一個全局有序的分布式鍵值存儲,這使得它能夠在分布式環(huán)境下高效地處理ORDER BYLIMIT操作,將分頁的復(fù)雜性下沉到了數(shù)據(jù)庫內(nèi)核層面,對應(yīng)用層透明。

4. 小結(jié)

從最初的全局查詢,到禁用跳頁、二次查詢、引入中間表,再到借助外部存儲,可以看到分頁查詢在分庫分表架構(gòu)下并不是一個簡單的 SQL 問題,而是牽涉到性能、數(shù)據(jù)一致性、交互設(shè)計等多維度的系統(tǒng)性挑戰(zhàn)。沒有放之四海而皆準的最佳方案,關(guān)鍵在于理解業(yè)務(wù)場景的需求邊界,然后在可接受的性能與復(fù)雜度之間做出取舍。面試中,能否系統(tǒng)性地剖析問題、提出不同層次的解決思路,并清晰地權(quán)衡優(yōu)缺點,往往比直接給出某個答案更能打動面試官。

責任編輯:武曉燕 來源: IT楊秀才
相關(guān)推薦

2024-01-17 14:42:24

分庫分表數(shù)據(jù)庫數(shù)據(jù)分片

2024-07-25 18:20:03

2025-04-09 00:00:00

2022-09-26 08:28:22

分庫分表數(shù)據(jù)

2024-02-19 11:49:23

JavaBitMap類型

2020-11-11 10:05:04

數(shù)據(jù)庫分庫分表美團面試

2025-11-19 01:00:00

2024-03-06 09:22:23

C#數(shù)據(jù)庫判重

2025-06-26 08:22:03

2025-02-12 08:43:06

2025-07-03 08:21:16

2018-03-14 09:49:35

數(shù)據(jù)庫遷移

2021-07-06 07:08:18

管控數(shù)據(jù)數(shù)倉

2022-02-19 21:36:05

Hive數(shù)據(jù),節(jié)點

2015-08-13 10:29:12

面試面試官

2025-09-17 10:08:43

2023-02-16 08:10:40

死鎖線程

2024-09-11 22:51:19

線程通訊Object

2025-03-17 00:00:00

2024-04-03 00:00:00

Redis集群代碼
點贊
收藏

51CTO技術(shù)棧公眾號

国产精品免费一区二区三区四区 | 成人免费一区二区三区视频网站| 免费亚洲一区| www.欧美免费| 岛国精品资源网站| 日日夜夜天天综合| 亚洲免费大片在线观看| 久久av一区二区三区漫画| а中文在线天堂| 国色天香一区二区| 中文字幕精品在线视频| 国产精品亚洲一区二区无码| 欧美一级大片| 亚洲不卡在线观看| 亚洲一区二区三区欧美| 天堂网在线资源| 国产精品综合在线视频| 国产成人精品久久二区二区91| 成人在线观看小视频| 国产精品手机在线播放 | 国产精品自产拍在线观看| 国产一级在线免费观看| 四虎国产精品免费观看| 国产婷婷色综合av蜜臀av| 香蕉视频xxxx| 国产日韩另类视频一区| 亚洲成人av一区| 公共露出暴露狂另类av| 高清av在线| 99久久99久久精品国产片果冻 | jizz国产精品| 正在播放亚洲一区| www黄色在线| 五月天国产在线| 亚洲午夜激情网站| 大片在线观看网站免费收看| jizzjizz在线观看| 国产亚洲人成网站| 蜜桃传媒视频麻豆第一区免费观看 | 2019国产精品视频| 136福利视频导航| 日韩精彩视频在线观看| 日本韩国欧美精品大片卡二| 中日韩精品视频在线观看| 欧美激情1区2区| 久久亚洲精品一区| 国产免费一区二区三区四区| 日韩电影免费在线观看| 在线视频精品一| 特级西西www444人体聚色| 免费视频国产一区| 亚洲欧美成人网| 亚洲第一页av| 婷婷亚洲精品| 亚洲一级黄色片| 无码人妻精品一区二区中文| 久久成人高清| 伊人亚洲福利一区二区三区| 中字幕一区二区三区乱码| 国产欧美日韩精品一区二区免费| 日韩av中文字幕在线免费观看| 中文字幕人妻一区| 美国成人xxx| 亚洲精品日韩丝袜精品| 一道本在线观看| 日韩极品一区| 欧美乱人伦中文字幕在线| 欧美黄色一级网站| 天天操天天干天天操| 美脚丝袜脚交一区二区| 亚洲奶大毛多的老太婆| 久久精品一区二区三区四区| 欧美日韩久久精品| 在线免费观看黄色av| 在线观看成人毛片| 欧美日韩精品不卡| 在线观看av的网址| 欧美成年黄网站色视频| 亚洲欧美综合在线精品| 青青视频免费在线观看| 国内高清免费在线视频| 精品久久久在线观看| 久久精品网站视频| 精品99re| 日韩精品www| 久久久精品成人| 欧美精品99| 51ⅴ精品国产91久久久久久| 中文字幕精品在线观看| 国产盗摄一区二区三区| 六十路精品视频| 日本在线免费| 欧美日韩激情美女| mm131国产精品| 黄色美女久久久| 国产一区二区美女视频| 久久久久久久久久网站| 久久精品官网| 成人欧美一区二区三区在线观看| 青青操视频在线| 亚洲精品高清在线| chinese少妇国语对白| 日韩一二三区| 最近2019年中文视频免费在线观看| 破处女黄色一级片| 玖玖精品视频| 国产福利久久| 免费看美女视频在线网站| 亚洲成av人影院在线观看网| 日韩av在线中文| 日本三级久久| 欧美精品第一页在线播放| 中文字幕有码无码人妻av蜜桃| 成人精品小蝌蚪| 裸体裸乳免费看| 国产精品久久久久av电视剧| 亚洲第一免费播放区| 免费在线观看h片| 日韩国产高清影视| 狠狠色综合欧美激情| bt在线麻豆视频| 欧美日韩一区成人| 国产在线观看h| 一区二区三区四区五区精品视频 | 日韩在线欧美在线| 羞羞影院体验区| 成人午夜精品一区二区三区| 日本三级中文字幕在线观看| 欧美a一级片| 国产亚洲欧洲在线| aaaaaa毛片| 91美女在线视频| 免费无码毛片一区二三区| 日韩中文字幕一区二区高清99| 日韩一二三在线视频播| 久久久蜜桃一区二区| 91网上在线视频| aa视频在线播放| 成人偷拍自拍| 久久久久国产精品一区| 高h放荡受浪受bl| 亚洲一区自拍偷拍| 国产成人精品综合久久久久99| 婷婷激情综合| 91亚洲精品视频| a视频在线观看免费| 欧美一级一级性生活免费录像| 国产精品麻豆一区| 国产一区在线观看麻豆| 99热这里只有精品7| 偷拍自拍亚洲| 欧美大片在线影院| 丰满人妻一区二区三区四区53 | 精品国产拍在线观看| 无码无套少妇毛多18pxxxx| 久久久久久综合| www.99av.com| 亚洲第一偷拍| 国产精品jizz视频| 亚洲午夜天堂| 中文字幕久热精品在线视频| 亚洲天天综合网| 亚洲免费在线电影| 亚洲精品无码一区二区| 99国内精品| 欧洲精品在线一区| 欧美激情不卡| 久久91亚洲精品中文字幕| 人妻一区二区三区免费| 好吊成人免视频| 青青草自拍偷拍| 高清国产午夜精品久久久久久| 国产特级淫片高清视频| 国产欧美日韩视频在线| 91手机视频在线观看| 91制片在线观看| 一区二区三区国产在线观看| 国产区精品在线| 天涯成人国产亚洲精品一区av| 日本一级免费视频| 国产一区二区免费看| 成人免费aaa| 日韩综合精品| 韩国成人一区| 99久久久成人国产精品| 欧美精品做受xxx性少妇| 久久人人爽人人爽人人片av免费| 国产精品国产三级国产传播| 超碰手机在线观看| 日韩大片在线免费观看| 国产成一区二区| 超碰人人在线| 亚洲毛片一区二区| 国产在线观看第一页| 艳妇臀荡乳欲伦亚洲一区| 人妻少妇一区二区| 国产精品中文字幕一区二区三区| 黄色一级视频在线播放| 色综合久久一区二区三区| 国产精品xxxx| 男女啪啪999亚洲精品| 久久久中文字幕| 蜜桃av在线免费观看| 亚洲精品久久久久久久久| 91资源在线视频| 欧美性猛交xxx| 免费一级a毛片夜夜看| 国产精品嫩草99a| 艳妇乳肉豪妇荡乳xxx| 久久精品国产精品亚洲精品| 国产乱子伦农村叉叉叉| 欧美一区二区三区免费看| 日韩jizzz| 老牛国内精品亚洲成av人片| 亚洲xxxxx性| 国产91欧美| 青青草国产精品一区二区| 91超碰在线免费| 欧美成人精品在线视频| 婷婷成人激情| 亚洲一级一级97网| 少妇av一区二区| 欧美成人福利视频| 国产剧情精品在线| 欧美喷水一区二区| 亚洲视屏在线观看| 色综合天天在线| 欧美三级韩国三级日本三斤在线观看| 亚洲精品成人少妇| 性欧美疯狂猛交69hd| 中文在线一区二区| 天天躁夜夜躁狠狠是什么心态| 91小视频在线免费看| 9.1在线观看免费| 成人一区二区三区| 亚洲AV成人精品| 成人小视频免费观看| 女人扒开双腿让男人捅| 国产激情视频一区二区三区欧美| 亚洲怡红院在线| 国产麻豆日韩欧美久久| 亚洲一二三不卡| 国产精品中文字幕日韩精品| 日本网站在线看| 国产高清视频一区| 51自拍视频在线观看| 国产精品一区二区三区网站| av地址在线观看| 成人在线综合网| 中文字幕一区二区久久人妻网站| 91丝袜国产在线播放| 黄色国产在线观看| 久久色.com| 超碰人人干人人| 18成人在线观看| 久久国产精品二区| 欧美日韩国产在线看| 精品国产午夜福利| 欧美在线观看你懂的| 伊人网视频在线| 欧美一区二区免费观在线| www.黄色国产| 亚洲国产成人精品久久久国产成人一区| 黄频网站在线观看| 日韩成人激情视频| 第一福利在线| 久久精视频免费在线久久完整在线看| av片在线观看永久免费| 久久久视频在线| 欧美一级大片| 亚洲a在线播放| 欧美性生活一级片| 一区二区成人国产精品| 亚洲欧美一区在线| 国产黄色一级网站| 免费观看一级特黄欧美大片| 国模大尺度视频| 97aⅴ精品视频一二三区| 韩国女同性做爰三级| 亚洲视频在线一区观看| 国产无遮挡又黄又爽| 欧美在线999| 精品国自产拍在线观看| 国产视频精品久久久| h视频网站在线观看| 久久久久久久久久亚洲| 欧美舌奴丨vk视频| 97超级在线观看免费高清完整版电视剧| 国产伦精品一区二区三区免费优势 | 91视频欧美| 91成人超碰| 99国产精品久久久久久久久久| 日本高清xxxx| 国产亚洲毛片| 久久成年人网站| 26uuu色噜噜精品一区二区| 免费观看特级毛片| 精品国产成人在线| 国产精品丝袜黑色高跟鞋| 精品视频www| 国产丝袜在线| 国产成人91久久精品| 天堂av一区| 午夜精品美女久久久久av福利| 黄色亚洲精品| 亚洲久久中文字幕| 99久久免费国产| 亚洲最大的黄色网址| 色婷婷一区二区三区四区| 好吊色视频一区二区| 久久亚洲精品一区| 草莓视频成人appios| 久久精品国产精品国产精品污| 亚洲电影在线一区二区三区| 九九九在线观看视频| 波多野结衣精品在线| 99久久婷婷国产综合| 欧美色图片你懂的| 欧美日本韩国一区二区| 久久久久久伊人| 免费观看性欧美大片无片| 亚洲精品中文字幕在线| 亚洲一区视频| 亚洲av网址在线| 亚洲影院理伦片| 精品国产乱码一区二区三| 日韩中文在线中文网在线观看| 午夜精品久久久久久久久久蜜桃| 国内精品二区| 精品成人久久| 亚洲婷婷在线观看| 一区二区三区日韩在线观看| 国产精品毛片一区视频播| y97精品国产97久久久久久| 日本美女久久| 午夜精品亚洲一区二区三区嫩草| 羞羞答答国产精品www一本| 蜜臀av粉嫩av懂色av| 亚洲一区自拍偷拍| 久久久久久久国产精品毛片| 九九**精品视频免费播放| 欧美bbbbb性bbbbb视频| 精品久久在线播放| 性感美女视频一二三| 欧美一区二区三区免费视| 欧美大片网址| jizzjizzxxxx| 久久久www成人免费无遮挡大片| 国产成人在线播放视频| 日韩av在线影院| 日韩精品影片| 亚洲制服中文| 国产精品18久久久久| 久久影院一区二区| 亚洲第一级黄色片| 男人皇宫亚洲男人2020| 色姑娘综合网| 激情欧美一区二区| 免费一级黄色大片| 亚洲精品理论电影| 嫩草伊人久久精品少妇av杨幂| 亚洲免费不卡| 国产精品亚洲视频| 中国一级免费毛片| 在线视频免费一区二区| 久久天堂久久| 欧美日本视频在线观看| 久久精品在这里| 国产美女三级无套内谢| 欧美激情精品久久久久久变态| 韩国精品福利一区二区三区| 欧美三级一级片| 欧美经典一区二区三区| 精品二区在线观看| 欧美一级视频一区二区| 人人狠狠综合久久亚洲婷| 色婷婷一区二区三区在线观看| 亚洲成av人影院| 91在线高清| 国产精品一区二区三区免费观看 | 国产亚洲精品超碰| 91久久久久久久久久久久| 久久男人资源视频| 精品精品久久| 国产成人精品一区二区三区在线观看| 欧美日韩综合视频| 精品麻豆一区二区三区| 久久99国产精品99久久| 六月丁香婷婷色狠狠久久| 国产一级一片免费播放放a| 中文字幕亚洲无线码a| 红杏视频成人| 亚洲图片 自拍偷拍| 欧美性猛交xxxx黑人| 成人黄视频在线观看| 日韩av一级大片| 成人动漫一区二区在线| 亚洲影视一区二区| 奇米成人av国产一区二区三区| 欧美 日韩 国产精品免费观看|