mysql cat sharding_Mysql系列八:Mycat和Sharding-jdbc的區別、Mycat分片join、Mycat分頁中的坑、Mycat注解、Catlet使用...

一、Mycat和Sharding-jdbc的區別

1)mycat是一個中間件的第三方應用,sharding-jdbc是一個jar包

2)使用mycat時不需要改代碼,而使用sharding-jdbc時需要修改代碼

Mycat(proxy中間件層):

04a245cb2f32bb2d76fa302c60ce90df.png

Sharding-jdbc(TDDL為代表的應用層):

7f3b6a574b641ba58d93bb5ae108f125.png

二、Mycat分片join

在前面的文章Mysql系列四:數據庫分庫分表基礎理論中,已經說過分庫分表需要應對的技術難題有如下幾個:

1.)分布式全局唯一id

2.)分片規則和策略

3.)跨分片技術問題

4.)跨分片事物問題

下面我們來看一下Mycat是如何解決跨分片技術問題——分片join的

1. 使用全局表方式解決跨分片join問題

1.1 先在server.xml里面全局表一致性檢測

1

1.2 在schema.xml里面配置全局表

全局表說明:

1)全局表的插入、更新操作會實時在所有節點上執行,保持各個分片數據的一致性

2)全局表的查詢操作只從一個節點上獲取

3)全局表可以跟任何一個表進行join操作

2. 使用Share Join方式解決跨分片join問題

Share Join是一個簡單的跨分片join,基於HBT(Human Brain Tech)的方式實現。

原理:解析SQL語句,拆分成單表的SQL語句執行,然后把各個節點的數據匯集。

示例:

/*!mycat:catlet=io.mycat.catlets.ShareJoin*/select * from employee a, employee_detail b where a.id = b.id;

說明:目前只支持兩張分片表的Join,如果要支持多張表需要自己改造程序代碼或者改造Mycat的源代碼

對應Mycat源碼:

io.mycat.catlets.ShareJoin

io.mycat.catlets.Catlet

public class ShareJoin implements Catlet

3. 使用ER Join方式解決跨分片join問題

ER表也叫父子表,子表存儲在哪個分片上依賴於父表的存儲位置,並且和父表存儲同一個分片上,即子表的記錄與所關聯的父表記錄存放在同一個數據分片上,從而解決跨庫join的問題

在schema.xml里面的配置

說明:

childTable:標簽用來聲明子表:

joinKey:聲明子表的那個字段和父表關聯

parentKey:聲明父表的關聯主鍵

primaryKey:父表自身的主鍵

三、Mycat分頁中的坑

Mycat分頁的大坑一定要注意:

在對應的分片上去查詢分頁數據的時候是從第一條記錄開始掃描,然后再取出對應的分頁數據,如

SELECT * FROM customer ORDER BY id LIMIT 1000100, 100;

這個sql語句被Mycat轉化后

1 -> dn1{SELECT * FROM customer ORDER BY id LIMIT 0, 1000100}2 -> dn2{SELECT * FROM customer ORDER BY id LIMIT 0, 1000100}

所以要在Mycat的server.xm里面開啟使用非堆內存。否則內存會爆掉

1

優化:

1)先查出id

SELECT id FROM customer ORDER BY id LIMIT 1000100, 100;

這個sql語句被mycat轉化后

1 -> dn1{SELECT id FROM customer ORDER BY id LIMIT 0, 1000100}2 -> dn2{SELECT id FROM customer ORDER BY id LIMIT 0, 1000100}

2) 拿到所有的id以后再取獲取需要的數據

SELECT * FROM customer where id in(1,2,3....);

這個sql語句被mycat轉化后

1 -> dn1{SELECT * FROM customer where id in(1,2,3....);}2 -> dn2{SELECT * FROM customer where id in(1,2,3....);}

四、Mycat注解

1. Mycat不支持的SQL語句:

1)  某些SQL語法,如insert into......select.....

2)  跨庫關聯查詢

3)存儲過程創建

4)存儲過程調用

所以Mycat提供Mycat注解來解決上面這些不支持的SQL語句

Mycat的解決辦法:Mycat注解

語法:

/*!mycat:sql=Mycat注解SQL語句*/真正執行的SQL   !號方式

/*#mycat:sql=Mycat注解SQL語句*/真正執行的SQL #號方式

/**mycat:sql=Mycat注解SQL語句*/真正執行的SQL   *號方式

原理:

使用mycat不支持的SQL替換mycat支持的SQL,運行Mycat不支持的SQL

df9f8ec23106aa3cc13ae74fa30d274c.png

Mycat注解規范:

1) 注解SQL使用select語句,不允許使用delete/update/insert等語句;雖然delete/update/insert等語句也能用在注解中,但這些語句在Sql處理中有額外的邏輯判斷,從性能考慮,請使用select語句。

2) 注解SQL禁用表關聯語句。

3) 注解SQL盡量用最簡單的SQL語句,如select id from tab_a where id=’10000’(如果必要,最好能在注解中指定分片)

4) 無論是原始SQL 還是注解SQL,禁止DDL語句

5) 能不用注解的盡量不用

2. Mycat注解解決不支持insert into......select.....

/*!mycat:sql=select 1*/insert into travelrecord(id,user_id,traveldate,fee,days) select 3,'Tom','20180826',100,8;

3. Mycat注解創建表

/*!mycat:sql=select 1 from test*/create table test2(id int);

4. Mycat注解創建存儲過程

/*!mycat:sql=select 1 from test*/create procedure 'test_proc()' begin end;

5. Mycat注解調用存儲過程

/*!mycat:sql=select * from user where id=1*/call test_proc();

6. Mycat注解讀寫分離數據源選擇

/*!mycat:db_type=master*/select * fromtravelrecord;(強制走主庫)/*!mycat:db_type=slave*/select * from travelrecord;(強制走從庫)

五、Catlet使用

通過Catlet支持跨分片復雜SQL實現以及存儲過程支持等等

使用方式:通過mycat注解方式來執行

1. 跨分片聯合查詢注解支持

/*!mycat:catlet=io.mycat.catlets.ShareJoin*/select o.id,u.* from order o,user u where o.user_id=u.id;

2. 批量插入與ID自增長結合的支持

/*!mycat:catlet=io.mycat.route.sequence.BatchInsertSequence*/insert into user(name) values('Tom'),('Cat'),('Alan');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值