Chinaunix首页 | 论坛 | 博客
  • 博客访问: 434034
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 518
  • 用 户 组: 普通用户
  • 注册时间: 2015-12-14 12:10
个人简介

邮箱:oxwangfeng@qq.com

文章分类

全部博文(43)

文章存档

2021年(1)

2018年(7)

2017年(9)

2016年(26)

我的朋友

分类: 服务器与存储

2016-01-28 14:05:51


背景:

随着数据规模及其访问量对关系数据库提出了很大挑战:数十亿条的记录、数TB的数据、数千TPS、数万QPS让传统的关系数据库不堪重负,单纯的硬件升级已经无法使得问题得到解决。一般常见的做法就是进行水平拆分,通常选取某些业务字段作为拆分键,按照一定方式散列到不同的数据库服务器上,客户端请求通过中间件路由到不同的分区。但是在分库分表过程中,很容易带来跨机查询,这样就会带来了额外的带宽、IOCPU开销;

本方案主要是研讨在join关联中如何减少带宽、IOCPU开销,如何进行高效的进行关联操作。

OceanBasejoin关联采用预定义方式,一个表冗余了相关关联表的字段,并且采用每天定时把关联表的字段添加到相关表中。这样虽然增加了相应时间,但是每天需要定时进行数据合并并且进行数据冗余;这样的处理不太适合实时性要求比较高的OLTP应用。

目前已知的OLTP开源实现中,还没有对关联查询的较好支持;有些也仅仅是支持小表之间的关联,不适合用于大数据表之间的关联;

技术方案:

使用场景:

一个表的拆分键必须和另外一个表的拆分键进行关联;比如select A.ID1B.ID2 FROM A JOIN B ON A.ID1=B.ID1  A表的拆分键为ID1B表的拆分键为ID2ID2A的外键;

预处理:

在元数据中配置AB的关系:AB表都设置为相同的散列方式,具有相同的分片数。

本方案主要有4个步骤,其中步骤1),2),3)是不断迭代执行的。

1)首先解析出带有joinsql语句中所涉及的关联表,并且解析出关联的列;

2) 查找配置,查询join关联的两个列否具有主外键关系,是否具有相同的散列方式。如果有,则进行下一步;

3)根据路由,优化sql,并且生成执行计划。如果具有相同的主外键关系,并且配置中配置相同的散列方式,则相关联的数据不仅在相同的机器上,还在相对应的分片上。比如SELECT A.ID FROM A JOIN B ON A.ID = B.IDAIDBID是主外键关系,由于具有相同的散列方式。进行执行计划后,sql就会被优化为SELECT An.ID FROM An JOIN Bn ON An.ID = Bn.ID, n表示某个分片,AB相关联的分片都在第n个分片上;

4)分发到相应数据库服务器上执行join关联查询

流程图





通过本技术方案,可以让分布式数据库系统能够保持分布式系统的优点的前提下,尽可能的处理复杂的带JOINsql语句,并且能够支持OLTP的应用。

    通过本技术方案,没有跨机查询,这样了减少了带宽、IO开销,也减少了中间件系统处理数据合并的CPU操作;所以,能够极大的提高分布式数据库系统的效率;此外,由于此技术方案实时性比较高,非常适合用在OLTP中;


关键:

1)在分布式mysql集群系统中,通过JOIN查询的解析以及查询配置,能够将具有主外键关系的join查询散列到相同的机器上,从而使整个系统能够处理复杂的带关联查询。

2)本方案处理join关联查询的方案,非常适合OLTP应用,实时性特别高,并且对cpu、io、带宽压力较小。

专业名词:

分布式mysql系统: 类似于mysql官方提供的mysql proxy架构的系统,能够分库分表,让sql进行并行查询并且结果汇总

 

sql解析:将sql语句中各种语法元素,比如关键词select,from,where, in, any等内部各种信息解析的处理。



阅读(2336) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~