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