關(guān)于數(shù)據(jù)庫(kù)水平切分中分頁(yè)查詢問題的解決方案
數(shù)據(jù)庫(kù)水平切分中分頁(yè)查詢的問題是本文要介紹的主要內(nèi)容。接下來我們通過一個(gè)例子來說明:昨天淘寶的同事問了我一個(gè)技術(shù)培訓(xùn)上講師問的問題:我們對(duì)數(shù)據(jù)庫(kù)關(guān)于商品的表放在了2個(gè)庫(kù),分別是A庫(kù)和B庫(kù) ,每個(gè)庫(kù)1張表,然后將id為奇數(shù)的放到A庫(kù)中,id為偶數(shù)的放到B庫(kù)中,現(xiàn)在需要查詢價(jià)格在100-200之間的商品,并根據(jù)銷量來排序,請(qǐng)給出具體的查詢方案,然后總結(jié)這個(gè)方案有什么缺點(diǎn)。
1.保證查詢結(jié)果正確性的方式:
比如查詢第1-20條記錄的時(shí)候,就得在A庫(kù)中執(zhí)行
- select*
- fromxxx
- wherexxx.price>=100and
- xxx.price<=200
- orderbyxxx.sales_volume
- limit0,20
然后B庫(kù)也同樣執(zhí)行這樣的SQL,***在程序中將2個(gè)數(shù)據(jù)庫(kù)返回的結(jié)果作一次合并,再取前20條返回給用戶
但是這樣就帶來一個(gè)問題,你是不知道到底前20的數(shù)據(jù)是怎么分布的,是10條在A庫(kù),10條在B庫(kù),還是15條在A庫(kù),5條在B庫(kù),當(dāng)用戶翻到第二頁(yè)的時(shí)候,就得在A庫(kù)中查詢前40條記錄,B庫(kù)中也查詢前40條記錄出來了...越是后面的頁(yè)數(shù),需要查詢的量就越大(PS:當(dāng)然你可以忽悠自己說絕大部分用戶最多就看前3頁(yè)的結(jié)果)
2.保證性能的方式:
這個(gè)就隨意得多了,為了保證性能,正確性是不太可能保證的,可以每次在A庫(kù)查10條,B庫(kù)查10條,然后直接返回,結(jié)果肯定和實(shí)際的結(jié)果有出入,但相差不至太多,不是每個(gè)用戶都會(huì)發(fā)現(xiàn)第2頁(yè)的商品可能出現(xiàn)銷量比第1頁(yè)的商品銷量還要大的情況。
以上兩種方法都各有優(yōu)缺點(diǎn),但***的結(jié)果可能都不是我們想要的,可是問題出在哪?貌似只有這2種方法了。
其實(shí)這里涉及到的是應(yīng)該如何去分庫(kù)的問題,如果結(jié)果是按id排序的話,這樣分庫(kù)顯然是沒問題的,但如果是按銷量排序的話,那數(shù)據(jù)庫(kù)分庫(kù)的時(shí)候其實(shí)應(yīng)該按銷量來切分,比如銷量在100以內(nèi)的放到A庫(kù),銷量在100-1000的放到B庫(kù),這樣查詢起來就輕松多了,最關(guān)鍵的就是要知道,我們分庫(kù)的規(guī)則應(yīng)該怎么去設(shè)定。
關(guān)于數(shù)據(jù)庫(kù)水平切分中分頁(yè)查詢的問題的解決方案就介紹到這里了,希望本次的介紹能夠?qū)δ兴鶐椭?/p>
【編輯推薦】






