最近研究分佈式數據庫架構,發現排序、分組及分頁讓着實人有點頭疼。現把問題及解決思路整理以下。web
1、 多分片(水平切分)返回結果合併(排序)redis
一、Select + None Aggregate Function的有序記錄合併排序 算法
解決思路:對各分片返回的有序記錄,進行排序去重合並。此處主要是編寫排序去重合數據庫
並算法。緩存
二、Select + None Aggregate Function的無序記錄合併網絡
解決思路:對各分片返回的無序記錄,進行去重合並。架構
優勢:實現比較簡單。併發
缺點:數據量越大,字段越多,去重處理就會越耗時。分佈式
三、Select + Aggregate Function的記錄合併(排序)函數
Oracle經常使用聚合函數:Count、Max、Min、Avg、Sum。
AF:Max、Min
思路:經過算法對各分片返回結果再求max、min值。
AF:Avg、Sum、Count
思路:分片間無重複記錄或字段時,經過算法對各分片返回結果再求avg、sum、count值。分片間有重複記錄或字段時,先對各分片記錄去重合並,再經過算法求avg、sum、count值。
好比:
select count(*) from user
select count(deptno) from user;
select count(distinct deptno) from user;
2、多分片(水平切分)返回結果分頁
解決思路:合併各分片返回結果,邏輯分頁。
優勢: 實現簡單。
缺點: 數據量越大,緩存壓力就越大。
分片數據量越大,查詢也會越慢。
3、多分片(水平切分)查詢有分組語法的合併
一、Group By Having + None Aggregate Function時
Select + None Aggregate Function
好比:select job user group by job;
思路:直接去重(排序)合併。
Select + Aggregate Function
好比:select max(sal),job user group by job;
思路:同Select + Aggregate Function的記錄合併(排序)。
二、Group By Having + Aggregate Function時
解決思路:去掉having AF條件查詢各分片,而後把數據放到一張表裏。再用group by having 聚合函數查詢。
4、分佈式數據庫架構--排序分組分頁參考解決方案
解決方案1:Hadoop + Hive。
思路:使用Hadoop HDFS來存儲數據,經過Hdoop MapReduce完成數據計算,經過Hive HQL語言使用部分與RDBBS同樣的表格查詢特性和分佈式存儲計算特性。
優勢: 能夠解決問題
具備併發處理能力
能夠離線處理
缺點: 實時性不能保證
網絡延遲會增長
異常捕獲難度增長
Web應用起來比較複雜
解決方案2:總庫集中查詢。
優勢: 能夠解決問題
實現簡單
缺點: 總庫數據不能太大
併發壓力大
5、小結
對於分佈式數據庫架構來講,排序、分頁、分組一直就是一個比較複雜的問題。避免此問題須要好好地設計分庫、分表策略。同時根據特定的場景來解決問題。也能夠充分利用海量數據存儲(Hadoop-HDFS|Hive|HBse)、搜索引擎(Lucene|Solr)及分佈式計算(MapReduce)等技術來解決問題。別外,也能夠用NoSQL技術替代關係性數據庫來解決問題,好比MogonDB\redis。