分布式数据库架构--排序、分页、分组、实现

jopen 10年前

最近研究分布式数据库架构,发现排序、分组及分页让着实人有点头疼。现把问题及解决思路整理如下。

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

          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。