Join绝对是关系型数据库中最常用一个特性,然而在分布式环境中,跨分片的join确是最复杂的,最难解决一个问题。
下面我们简单介绍下各种Join操作。
1:INNER JOIN
内连接,也叫等值连接,inner join产生同时符合A表和B表的一组数据,如图:
2:LEFT JOIN
左连接从A表(左)产生一套完整的记录,与匹配的B表记录(右表) .如果没有匹配,右侧将包含null,在Mysql中等同于left outer join,如图:
3:RIGHT JOIN
同Left join,AB表互换即可。
4: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的笛卡尔积表示所有可能的选课情况。
5:Full join
全连接产生的所有记录(双方匹配记录)在表A和表B。如果没有匹配,则对面将包含null。
性能建议
a:尽量避免使用Left join或Right join,而用Inner join
b:在使用Left join或Right join时,ON会优先执行,where条件在最后执行,所以在使用过程中,条件尽可能的在ON语句中判断,减少where的执行
c:少用子查询,而用join。
Mycat目前版本支持跨分片的join,主要实现的方式有四种。
全局表,ER分片,catletT(人工智能)和ShareJoin,ShareJoin在开发版中支持,前面三种方式1.3.0.1支持。