原创

mycat的分片join实践

Join绝对是关系型数据库中最常用的一个特性,然而在分布式环境中,跨分配的join却是最复杂的,最难解决的一个问题。
性能建议:
1、尽量避免使用left join或right join,而用inner join

2、在使用left join或right join时,on会优先执行,where条件在最后执行,所以再使用过程中,条件尽可能的在on语句中判断,减少where的执行

3、少使用子查询,而用join
    mycat目前版本支持跨分配的join,主要有四种实现方式
    1、全局表
    2、ER分片
    3、catletT(人工智能)
    4、ShareJoin

全局表和ER分片在之前的操作中已经讲过了,此处不再赘述,下面详细讲解下另外两种方式。
Share join
ShareJoin是一个简单的跨分片join,基于HBT的方式实现。目前支持2个表的join,原理是解析SQL语句,拆分成单表的SQL语句执行,然后把各个节点的数据汇集。

配置方式:
当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" />

修改schema.xml配置信息

<table name="company" primaryKey="id" dataNode="dn1,dn2,dn3" rule="mod-long" />
<table name="customers" primaryKey="id" dataNode="dn1,dn2" rule="sharding-by-intfile"/>

修改rule.xml配置信息

<tableRule name="mod-long">
      <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
      </rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
      <!-- how many data nodes -->
      <property name="count">3</property>
</function>
<tableRule name="sharding-by-intfile">
       <rule>
             <columns>sharding_id</columns>
             <algorithm>hash-int</algorithm>
       </rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
      <property name="mapFile">partition-hash-int.txt</property>
</function>

修改partition-hash-int.txt文件

10000=0
10010=1

sql语句:

create table company(id int primary key,name varchar(10)) engine=innodb;
insert company (id,name) values(1,'mycat');
insert company (id,name) values(2,'ibm');
insert company (id,name) values(3,'hp');

create table customers(id int not null primary key,name varchar(100),company_id int not null,sharding_id int not null);
insert into customers(id,name,company_id,sharding_id)values(1,'wang',1,10000),(2,'xue',2,10010),(3,'feng',3,10000);

验证:

-- 可以看到有时可以查出对应的结果,有时则查询不到
select a.*,b.ID,b.NAME as tit from customers a,company b where a.COMPANY_ID=b.ID;
--可以看到每次都可以直接查询到结果
/*!mycat:catlet=io.mycat.catlets.ShareJoin */
select a.*,b.ID,b.NAME as tit from customers a,company b where a.COMPANY_ID=b.ID;
--其他写法
/*!mycat:catlet=io.mycat.catlets.ShareJoin */
select a.*,b.ID,b.NAME as tit from customers a join company b on a.COMPANY_ID=b.ID;
/*!mycat:catlet=io.mycat.catlets.ShareJoin */
select a.*,b.ID,b.NAME as tit from customers a join company b where a.COMPANY_ID=b.ID;

本文链接地址:http://www.ysxbohui.com/article/110

正文到此结束