MyCat分片JOIN,分片规则

mycat 支持跨分片join,主要有四种方法:
1、全局表
字典表(变动不频繁,数据量总体变化不大,数据规模不大很少超过10W条记录)可以做为全局表
特性:
1)全局表的插入,更新操作会实时在所有节点上执行,保持各个分片的数据一致性。没有太激烈的update操作。
2)全局表查询只从一个节点获取
3)全局表可以和任何一个表进行JOIN操作

4) 多线程update 可以不是同一条记录,如果多线程udpate 全局表同一条记录会出现死锁,批量insert 是可以的。

配置:
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
不用写rule规则,要在所有节点为执行DDL语句
2、ER分片
借鉴了foundation DB的设计思路,将子表的存储位置依赖于主表,并且物理上坚信存放,因此彻底解决了JOIN的效率和性能问题。根据这一思路,mycat 提出了E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。
有一类业务,比如订单(order)和订单明细(order_detail),明细表会依赖订单表,也就是说存在表的主从关系。这类表适用于ER分片表,子表的记录与所关联的父表记录存放在同一个分片上,避免数据的JOIN跨库操作。
schema.xml 配置:
以order与order_detail 为例,schema.xml 中定义如下分片配置,order、order_detail 根据order_id 进行数据分片,保证相同的order_id的数据分到同一个分片上,在进行数据插入操作时,mycat会获取order所在在分片,然后将order_detail 也插入到order所在的分片。

<table name="order" dataNode="dn$1-32" rule="mod-long">
<childTable name="order_detail" primaryKey="id" joinKey="order_id" parentKey="order_id" />
</table>

3、catletT(人工智能)
mycat提供api ,通过编程解决业务系统中特定几个必须跨分片的SQL 的JOIN 逻辑。

4、ShareJoin
ShareJoin 是一个简单的跨分片 Join,基于 HBT 的方式实现。目前支持 2 个表癿的join,原理就是解析 SQL 语句,拆分成单表的 SQL 语句执行,然后把各个节点的数据汇集。
ShareJoin 在开发,前三种1.3.0.1 支持。


分片规则:
1、全局表

2、ER分片


3、多对多关联

有一种业务是“主表A+关系表+主表B”,比如说:商户+订单+会员。
会员要查询购买的订单,商户要查询售出的订单,那么要做如何的切分。目前总的原则是需要从业务角度来看,关系表更偏向哪个表,即是“A的关系”还是“B的关系”,来决定关系表跟从那个方向存储。

4、主键与非主键分片
如果没有任何字段可以作为分片字段的时候,主键分片就是唯一选择,其优点是按照主键的查询最快,当采
用自自增长的序列号作为主键时,还能比较均匀的将数捤分片在不同的节点上。
若有某个合适的业务字段比较合适作为分片字段,则建议采用此业务字段分片,选择分片字段的条件如下:
1、尽可能的比较均匀分布数捤到各个节点上;
2、该业务字段是最频繁的或者最重要的查诟条件。


当选择到了合适的业务字段作为分片规则的时候,不要担心“牺牲了主键的查询性能”,加为mycat 提供了“主键到分片”的缓存机制。按照主键查询不会损失性能。


<table name="t_user" primaryKey="user_id" dataNode="dn$1-32" rule="mod-long">
<childTable name="t_user_detail" primaryKey="id" joinKey="user_id" parentKey="user_id" />
</table>


对于非分片的table,填写primaryKey,此时mycat 会将根据主键查询的SQl语句的第一次执行结果进行分析,确定该table的某个主键在什么分片上,并把“主键-->分片”缓存。以后查询时会先查询缓存中是否有“主键-->分片”的映射,如果有直接查询,从而提高了非主键分片的查询性能。


mycat 性能建议
1、使用inner join ,尽量避免使用left join ,right join
2、使用left join,right join时 on条件会先执行,where条件会后执行。在使用时,条件尽量写的on后面,减少where的执行
3、少用子查询,用join

转载于:
作者:Jamin_Ma 
来源:CSDN 
原文:https://blog.csdn.net/convict_eva/article/details/51992635 

猜你喜欢

转载自blog.csdn.net/qq_39669058/article/details/85244130