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