Join
Join 绝对是关系型数据库中最常用一个特性,然而在分布式环境中,跨分片的 join 确是最复杂的,最难解决一 个问题。
Join:inner ,left,right,full,cross
尽量避免使用 Left join 或 Right join,而用 Inner join。
在使用 Left join 或 Right join 时,ON 会优先执行,where 条件在最后执行,所以在使用过程中,条件尽 可能的在 ON 语句中判断,减少 where 的执行少用子查询,而用 join。
Mycat 目前版本支持跨分片的 join,主要实现的方式有四种:全局表,ER 分片,catletT(人工智能)和 ShareJoin,ShareJoin 在开发版中支持,前面三种方式 1.3.0.1 支 持。
全局表
各个分片冗余存储
ER分片
将子表的存储位置依赖于主表,并且物理上紧邻存放,因此彻底解决了 JION 的效率和性能问题。
根据这一思路,提出了基于 E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分 片上。
Share Join
ShareJoin 是一个简单的跨分片 Join,基于 HBT 的方式实现。 原理就是解析 SQL 语句,拆分成单表的 SQL 语句执行,然后把各个节点的数据汇 集。
catlet(人工智能)
解决跨分片的 SQL JOIN 的问题,远比想象的复杂,而且往往无法实现高效的处理。
既然如此,就依靠人工 的智力,去编程解决业务系统中特定几个必须跨分片的 SQL 的 JOIN 逻辑。
MyCAT 提供特定的 API 供程序员调用,这就是 MyCAT 创新性的思路——人工智能。
以一个跨节点的 SQL 为例。 Select a.id,a.name,b.title from a,b where a.id=b.id 其中 a 在分片 1,2,3 上,b 在 4,5,6 上,需要把数据全部拉到本地(MyCAT 服务器),执行 JOIN 逻辑。