MyCat Join 专题 ---- ER 分片

ER Join:实体关系(entity relation) join

目录

ー:MyCat 权威指南

二:ER 分片实操


 

ー:MyCat 权威指南


MyCAT 借鉴了 NewSQL 领域的新秀 Foundation DB 的设计思路,Foundation DB 创新性的提出了 Table Group 的概念,其将子表的存储位置依赖于主表,并且物理上紧邻存放,因此彻底解决了 JION 的效率和性能问 题,根据这一思路,提出了基于 E-R 关系 的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。 

说白了就是将相关联的数据,需要级联查询的数据放进同一个分片中。

customer 采用 sharding-by-intfile 这个分片策略,或者其他的分片策略,分片在 dn1,dn2 上,orders 依赖父表进行分片,两个 表的关联关系为 orders.customer_id = customer.id

既字表是按照父表的分片字段进行分片的,这样的话,父表数据和字表数据的相关联的数据都会在同一个数据分片上。跨库分片 join 变得简单,子表可以配置多个。且可以进行嵌套查询。

于是数据分片和存储的示意图如下:

这样一来,分片 Dn1 上的的 customerDn1 上的 orders 就可以进行局部的 JOIN 联合,Dn2 上也如此,再合 并两个节点的数据即可完成整体的 JOIN,试想一下,每个分片上 orders 表有 100 万条,则 10 个分片就有 1 个亿,基 于 E-R 映射的数据分片模式,基本上解决了 80% 以上的企业应用所面临的问题。 配置 以上述例子为例,schema.xml 中定义如下的分片配置

<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">
    <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">
        <childTable name="order_items" joinKey="order_id" parentKey="id" />
    </childTable>
    <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" />
</table>

 

二:ER 分片实操


ER Join:不限制查询的表数,因为设计的原型就是所有相关联的数据都在同一个分页。

查询:按逻辑来说,子表不需要单独查询。或者只是主表的一个数据拓展。

子表单表查询:因为是按照主表的分片键路由的。所以只有主表的分片键查询条件才会路由到正确的位置。没有的话就全库查找数据集,之后合并多个数据集。

主表 + 子表 join 查询:有分片键的查询就路由到对应库。查询对应的 join 信息,没有的话就所有的库进行数据的 join ,之后合并。

限制:经过测试,没有表数的限制。既一个 table 标签中的所有表都可以进行 join 操作。此外还可以再与多个 global 全局表进行 join

 

本地测试:

<schema name="mydb" checkSQLschema="true" sqlMaxLimit="100">
    <table name="lsqtable" primaryKey="id" autoIncrement="true" dataNode="dn$1-2" rule="mod-long" >
        <childTable name="lsqtable_supplement" primaryKey="id" joinKey="id" parentKey="id" >
            <childTable name="lsqtable_supplement_items" joinKey="parent_id" parentKey="id" />
        </childTable>
        <childTable name="lsqtable_supplement_other" primaryKey="id" joinKey="id" parentKey="id" />
    </table>
    <table name="jointable" primaryKey="id" type="global" autoIncrement="true" dataNode="dn$1-2" />
    <table name="otherjointable" primaryKey="id" type="global" autoIncrement="true" dataNode="dn$1-2" />
</schema>


<dataNode name="dn1" dataHost="localhost1" database="mydb" />
<dataNode name="dn2" dataHost="localhost2" database="mydb" />

逻辑库:mydb

逻辑表:主表 lsqtest

子表补充表 

lsqtable_supplement 

子表补充表明细 

lsqtable_supplement_items 

主表动静分离子表 

lsqtable_supplement_other

所在数据节点:dn$1-2  dn$1-2  dn$1-2  dn$1-2  
分片键: id  id  parent_id id 

 

 

 

 

 

全局表:jointable                        otherjointable
所在数据节点:dn$1-2  dn$1-2  

 

 

 

所有子表会默认继承所属主表的 分片规则 来保证相关数据都在一个分片区之内。

 

查询语句:

explain select *
FROM lsqtable_supplement s
LEFT JOIN lsqtable l ON l.id = s.id
LEFT JOIN lsqtable_supplement_other o ON l.id = o.id
LEFT JOIN lsqtable_supplement_items i ON l.id = i.parent_id
INNER JOIN jointable j ON l.id = j.id
INNER JOIN otherjointable oj ON l.id = oj.id

会将查询语句路由到其他几个节点,每个节点执行相同语句获取结果集。之后 MyCat 会合并这些结果集。

该方案只适用于 主表A ---> 子表B ---> 字典表 这种情况

而这种 主表A ---> 关系表AB ---> 主表B  这种情况,两种主表属于不同的范畴,所以两主表插入 关系表AB 的值不保证保存在同一分片上。可以考虑冗余关系表的方法来保证所有节点相同。但是又不符合全局表的定义。因为是一种常变的数据。

一般情况下,ER分区全局表 可以满足大部分的需求。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值