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