關於分庫分表中分組,排序,分頁實現
分庫分表的原理估計就不說了,一般是會有一個種子欄位作為分庫分表路由欄位,比如如果是對書籍表進行分表,可以用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這種,還有許多可以優化的地方,此處僅作為學習參考。
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※分表分庫時機選擇及策略
※TypeScript基礎之高級類型的可辨識聯合(Discriminated Unions)
TAG:程序員小新人學習 |