mycat分片join——sharejoin-改自官方权威指南

本文介绍了Mycat数据库中间件中的ShareJoin特性,用于解决跨分片JOIN的问题。通过解析SQL并拆分为单表查询,ShareJoin能够在多个数据节点上执行并汇总结果。配置灵活,支持不同数据节点的表进行JOIN操作。通过示例展示了不同JOIN写法的使用效果,如普通JOIN、JOIN with ON 和 WHERE JOIN,以及对星号(*)的支持。

Share join

ShareJoin 是一个简单的跨分片 Join,基于 HBT 的方式实现。

目前支持 2 个表的 join,原理就是解析 SQL 语句,拆分成单表的 SQL 语句执行,然后把各个节点的数据汇集。

配置

支持任意配置的 A,B 表如:

A,B dataNode 相同

<tablename="A" dataNode="dn1,dn2,dn3"rule="auto-sharding-long" />

<tablename="B" dataNode="dn1,dn2,dn3"rule="auto-sharding-long" />

A,B dataNode 不同

<tablename="A" dataNode="dn1,dn2 "rule="auto-sharding-long" />

<tablename="B" dataNode="dn1,dn2,dn3"rule="auto-sharding-long" />

<tablename="A" dataNode="dn1 "rule="auto-sharding-long" />

<tablename="B" dataNode=" dn2,dn3"rule="auto-sharding-long" />

代码测试

先把表 company 从全局表修改下配置

<tablename="company" primaryKey="ID"dataNode="dn1,dn2,dn3" rule="mod-long" />

重新插入数据

create table company(id int not null primary key,name varchar(100));

mysql> deletefrom company;

Query OK, 9 rowsaffected (0.19 sec)

insert company(id,name) values(1,'mycat');

insert company(id,name) values(2,'ibm');

insert company(id,name) values(3,'hp');

 

下面可以看下普通的 join sharejoin 的区别

create table customer(id int not null primary key,namevarchar(100),company_id int not null,sharding_id int not null);

insert into customer(id,name,company_id,sharding_id)values(1,'wang',1,10000),(2,'xue',2,10010),(3,'feng',3,10000);

 

普通的join

mysql> selecta.*,b.id, b.name as tit from customer a,company b where a.company_id=b.id;

+----+------+------------+-------------+----+------+

| id | name |company_id | sharding_id | id | tit |

+----+------+------------+-------------+----+------+

| 3 | feng | 3 |10000 | 3 | hp |

+----+------+------------+-------------+----+------+

1 row in set (0.03 sec)---------会发现只查出一条,但是按照正常的逻辑这里应该是查出来三条,但是因为分库分表了,所以要用share join,如下:

mysql> /*!mycat:catlet=demo.catlets.ShareJoin */ select a.*,b.id,b.name as tit from customer a,company b ona.company_id=b.id;------------------------------------from a,b ona.id=b.id

+----+------+------------+-------------+----+-------+

| id | name |company_id | sharding_id | id | tit |

+----+------+------------+-------------+----+-------+

| 3 | feng | 3 |10000 | 3 | hp |

| 1 | wang | 1 |10000 | 1 | mycat |

| 2 | xue | 2 |10010 | 2 | ibm |

+----+------+------------+-------------+----+-------+

3 rows in set (0.05sec)

其他两种写法

/*!mycat:catlet=demo.catlets.ShareJoin*/ select a.*,b.id, b.name as tit from customer a join company b on

a.company_id=b.id;-------------------from a join b ona.id=b.id

+----+------+------------+-------------+----+-------+

| id | name |company_id | sharding_id | id | tit |

+----+------+------------+-------------+----+-------+

| 3 | feng | 3 |10000 | 3 | hp |

| 1 | wang | 1 |10000 | 1 | mycat |

| 2 | xue | 2 |10010 | 2 | ibm |

+----+------+------------+-------------+----+-------+

3 rows in set (0.01sec)

/*!mycat:catlet=demo.catlets.ShareJoin*/ select a.*,b.id, b.name as tit from customer a join company b where

a.company_id=b.id;--------------------------from ajoin b where a.id=b.id

+----+------+------------+-------------+----+-------+

| id | name |company_id | sharding_id | id | tit |

+----+------+------------+-------------+----+-------+

| 3 | feng | 3 |10000 | 3 | hp |

| 1 | wang | 1 |10000 | 1 | mycat |

| 2 | xue | 2 |10010 | 2 | ibm |

+----+------+------------+-------------+----+-------+

3 rows in set (0.01sec)

*的支持,还可以这样写 SQL

mysql>/*!mycat:catlet=demo.catlets.ShareJoin */ select a.*,b.* from customer a joincompany b on

a.company_id=b.id;

+----+------+------------+-------------+-------+

| id | name |company_id | sharding_id | name |

+----+------+------------+-------------+-------+

| 1 | wang | 1 |10000 | mycat |

| 2 | xue | 2 |10010 | ibm |

| 3 | feng | 3 |10000 | hp |

+----+------+------------+-------------+-------+

3 rows in set (0.02sec)

mysql>/*!mycat:catlet=demo.catlets.ShareJoin */ select * from customer a join companyb on

a.company_id=b.id;

+----+------+------------+-------------+-------+

104

| id | name |company_id | sharding_id | name |

+----+------+------------+-------------+-------+

| 1 | wang | 1 |10000 | mycat |

| 2 | xue | 2 |10010 | ibm |

| 3 | feng | 3 |10000 | hp |

+----+------+------------+-------------+-------+

3 rows in set (0.02sec)

/*!mycat:catlet=demo.catlets.ShareJoin*/ select a.id,a.user_id,a.traveldate,a.fee,a.days,b.id as nnid, b.title as

tit fromtravelrecord a join hotnews b on b.id=a.days order by a.id ;

 

以上两张表的配置:

 <table name="company"primaryKey="ID" dataNode="dn1,dn2,dn3"rule="mod-long"/>

 <table name="customer"primaryKey="ID" dataNode="dn2,dn2"rule="sharding-by-intfile">

 

 

mysql物理库中的分配

customer

mysql>select * from db1.customer;

+----+------+------------+-------------+

| id |name | company_id | sharding_id |

+----+------+------------+-------------+

|  1 | wang |          1 |       10000 |

|  3 | feng |          3 |       10000 |

+----+------+------------+-------------+

2 rowsin set (0.00 sec)

 

mysql>select * from db2.customer;

+----+------+------------+-------------+

| id |name | company_id | sharding_id |

+----+------+------------+-------------+

|  2 | xue |          2 |       10010 |

+----+------+------------+-------------+

1 rowin set (0.00 sec)

 

company

mysql> select *from db1.company;

+----+--------+

| id | name   |

+----+--------+

|  3 | hp    |

|  6 | huawei |

+----+--------+

2 rows in set (0.00sec)

 

mysql> select *from db2.company;

+----+--------+

| id | name   |

+----+--------+

|  1 | mycat |

|  4 | anyong |

+----+--------+

2 rows in set (0.00sec)

 

mysql> select *from db3.company;

+----+-------+

| id | name  |

+----+-------+

|  2 | ibm  |

|  5 | deqin |

+----+-------+

2 rows in set (0.01sec)

 

 

以上两张表在逻辑库中的查到的结果

mycat>select *from customer;

+----+------+------------+-------------+

| id | name |company_id | sharding_id |

+----+------+------------+-------------+

|  2 | xue |          2 |       10010 |

|  1 | wang |          1 |       10000 |

|  3 | feng |          3 |       10000 |

+----+------+------------+-------------+

3 rows in set (0.01sec)

 

mycat>select *from company;

+----+--------+

| id | name   |

+----+--------+

|  1 | mycat |

|  4 | anyong |

|  3 | hp    |

|  6 | huawei |

|  2 | ibm   |

|  5 | deqin |

+----+--------+

6 rows in set (0.02sec)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值