當前位置:
首頁 > 知識 > 關於分庫分表中分組,排序,分頁實現

關於分庫分表中分組,排序,分頁實現

分庫分表的原理估計就不說了,一般是會有一個種子欄位作為分庫分表路由欄位,比如如果是對書籍表進行分表,可以用bookId作為種子欄位,然後如果要分128張表,用bookId%128 作為分表路由規則。

比如如果bookId為1的數據分在book_1表,bookId為2的分到book_2,bookId為129的分到book_1表。

然後分組,排序,分頁的實現,如果加了where bookId 作為條件,跟單表查詢差不多,無非多一個路由選表而已。

下面主要分析無種子欄位作為條件的分組,排序,以及分頁實現。

1.分組

分組實現較簡單,只需對128張表各自進行group by ,將128張表的結果,全都取到內存中,進行合併,如果有having條件再根據合併的結果進行篩選。

2.排序

排序都是要根據某個欄位進行排序,首先要對128張表排序後的數據取出到內存,然後可以通過歸併排序的方式對128張表的數據進行重排,最終展示到前端。當然,排序難以支持大批量數據的返回。所以建議一般只limit 1000條,這樣才可實現內存中排序。如果數據量非常大,大到內存都裝不下,可以通過將數據緩存到文件的方式實現,這點跟hadoop的實現原理是一致的。當然還有大到文件都裝不下的情況,則要編寫更複雜的排序演算法,那個我們就不討論了。

3.分頁

分頁我認為為了自然分頁,最好能在資料庫表增加一個數據創建時間作為輔助欄位,然後分頁的數據根據創建時間進行排序,然後取出符合條件的最前面n條即可。如果沒有創建時間可以根據表下標數據進行返回,比如優先返回下標最小的數據。當然核心問題基本跟排序類似,如果數據量很大會非常慢,甚至內存裝不下。

4.其他如sum,avg,max等方法

基本是對128張表的數據先各自進行計算,然後再歸併結果返回即可

當然以上只是簡單實現,我相信真正去做一個分庫分表的插件,如shadingJdbc這種,還有許多可以優化的地方,此處僅作為學習參考。

關於分庫分表中分組,排序,分頁實現

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

分表分庫時機選擇及策略
TypeScript基礎之高級類型的可辨識聯合(Discriminated Unions)

TAG:程序員小新人學習 |