Mycat 系列之 JOIN 介绍

Join 绝对是关系型数据库中最常用一个特性,然而在分布式环境中,跨分片的 join 确是最复杂、最难解决的一个问题。

·

各种 JOIN 介绍

·

INNER JOIN(内连接/等值连接)

inner join 产生同时符合 A 表和 B 表的一组数据。
在这里插入图片描述

LEFT JOIN(左连接)

从 A 表(左)产生一套完整的记录,与匹配的 B 表记录(右表)。如果没有匹配,右侧将包含 null。
在这里插入图片描述

RIGHT JOIN(右连接)

同 LEFT JOIN(左连接),AB表互换即可。

·

CROSS JOIN(交叉连接)

交叉连接,得到的结果是两个表的乘积,即笛卡尔积。

笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。

例如:如果 A 表示某学校学生的集合,B 表示该学校所有课程的集合,则 A 与 B 的笛卡尔积表示所有可能的选课情况。

·

FULL JOIN(全连接)

全连接产生的所有记录(双方匹配记录)在表 A 和表 B。如果没有匹配,则对面将包含null。
在这里插入图片描述

·

JOIN 使用建议

  • 尽量避免使用 Left join 或 Right join,而用 Inner join。
  • 在使用 Left join 或 Right join 时,ON 会优先执行,where 条件在最后执行,所以在使用过程中,条件尽可能的在
    ON 语句中判断,减少 where 的执行。
  • 少用子查询,而用 join。

·

Mycat 支持跨分片的 join

Mycat 目前版本支持跨分片的 join,主要实现的方式有四种:全局表、ER 分片、catletT(人工智能)和 Share Join。

·

全局表

一个真实的业务系统中,往往存在大量的类似字典表的表(例如:地市编码表),它们与业务表之间可能有关系,这种关系,可以理解为"标签",而不应理解为通常的"主从关系"。这些表具有以下几个特性:

  • 变动不频繁。
  • 数据量总体变化不大。
  • 数据规模不大,很少有超过数十万条记录。

对于这类的表,在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些字典表之间的关联,就成了比较棘手的问题。鉴于此,MyCAT 定义了一种特殊的表,称之为"全局表",全局表具有以下特性:

  • 全局表的插入、更新操作会在所有节点上执行,保持各个分片的数据一致性。
  • 全局表的查询操作,只从一个节点获取。
  • 全局表可以跟任何一个表进行 JOIN 操作。

·

全局表配置示例

全局表配置比较简单,不用写 Rule 规则,如下配置即可:

<table name="city_code" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />

注意: 全局表需要在每个分片节点上运行建表 SQL。

·

ER Join

MyCAT 借鉴了 NewSQL 领域的新秀 Foundation DB 的设计思路,Foundation DB 创新性的提出了 Table Group 的概念,其将子表的存储位置依赖于主表,并且物理上紧邻存放,因此彻底解决了 JION 的效率和性能问题。

Mycat 根据这一思路,提出了基于 E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。即子表依赖于父表,通过表分组(Table Group)保证数据 Join 不会跨库操作。如下示例:customer 采用 sharding-by-intfile 分片策略,分片在 dn1,dn2 上,orders 依赖父表进行分片,两个表的关联关系为 orders.customer_id=customer.id。于是数据分片和存储的示意图如下:
在这里插入图片描述

这样一来,分片 dn1 上的 customer 与 dn1 上的 orders 就可以进行局部的 JOIN 联合,dn2 上也如此;再合并两个节点的数据即可完成整体的 JOIN。

·

ER 表配置示例:

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

·

Share join

ShareJoin 是一个简单的跨分片 Join,基于 HBT 的方式实现。目前支持 2 个表的 join。

原理就是解析 SQL 语句,拆分成单表的 SQL 语句执行,然后把各个节点的数据汇集。

·

Share join 配置示例

Share join 支持任意配置的 AB 表

<!--A,B 的 dataNode 相同-->
<table name="A" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="B" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<!--A,B 的 dataNode 不同-->
<table name="A" dataNode="dn1,dn2 " rule="auto-sharding-long" />
<table name="B" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<!--或-->
<table name="A" dataNode="dn1 " rule="auto-sharding-long" />
<table name="B" dataNode=" dn2,dn3" rule="auto-sharding-long" />

在查询的时候需要添加 mycat 注释 “/*!mycat:catlet=demo.catlets.ShareJoin */”。

mysql> /*!mycat:catlet=demo.catlets.ShareJoin */ select a.*,b.id, b.name as tit from customer a,company b on a.company_id=b.id;

·

catletT(人工智能)

MyCAT 提供特定的 API 供程序员调用,使其依靠编程解决业务系统中特定几个必须跨分片的 SQL 的 JOIN 逻辑。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值