分布式數據庫架構--排序、分頁、分組、實現

jopen 10年前發布 | 41K 次閱讀 分布式

最近研究分布式數據庫架構,發現排序、分組及分頁讓著實人有點頭疼。現把問題及解決思路整理如下。

一、 多分片(水平切分)返回結果合并(排序)

          1、Select + None Aggregate Function的有序記錄合并排序 

           解決思路:對各分片返回的有序記錄,進行排序去重合并。此處主要是編寫排序去重合

          并算法。

          2、Select + None Aggregate Function的無序記錄合并

           解決思路:對各分片返回的無序記錄,進行去重合并。

           優點:實現比較簡單。

           缺點:數據量越大,字段越多,去重處理就會越耗時。

          3、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;

二、多分片(水平切分)返回結果分頁

         解決思路:合并各分片返回結果,邏輯分頁。

        優點:  實現簡單。

        缺點:  數據量越大,緩存壓力就越大。

                     分片數據量越大,查詢也會越慢。

三、多分片(水平切分)查詢有分組語法的合并

         1、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的記錄合并(排序)。

         2、Group By Having + Aggregate Function時

         解決思路:去掉having AF條件查詢各分片,然后把數據放到一張表里。再用group by having 聚合函數查詢。

四、分布式數據庫架構--排序分組分頁參考解決方案

         解決方案1:Hadoop + Hive。

         思路:使用Hadoop HDFS來存儲數據,通過Hdoop MapReduce完成數據計算,通過Hive HQL語言使用部分與RDBBS一樣的表格查詢特性和分布式存儲計算特性。

         優點: 可以解決問題

                       具有并發處理能力

                       可以離線處理

         缺點:  實時性不能保證

                       網絡延遲會增加

                       異常捕獲難度增加

                       Web應用起來比較復雜

          解決方案2:總庫集中查詢。

          優點: 可以解決問題        

                       實現簡單

          缺點: 總庫數據不能太大

                        并發壓力大

五、小結

         對于分布式數據庫架構來說,排序、分頁、分組一直就是一個比較復雜的問題。避免此問題需要好好地設計分庫、分表策略。同時根據特定的場景來解決問題。也可以充分利用海量數據存儲(Hadoop-HDFS|Hive|HBse)、搜索引擎(Lucene|Solr)及分布式計算(MapReduce)等技術來解決問題。
別外,也可以用NoSQL技術替代關系性數據庫來解決問題,比如MogonDB\redis。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!