Mysql系列八:Mycat和Sharding-jdbc的區別、Mycat分區join、Mycat分頁中的坑、Mycat註解、Catlet使用

來源:互聯網
上載者:User
一、Mycat和Sharding-jdbc的區別

1)mycat是一個中介軟體的第三方應用,sharding-jdbc是一個jar包

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

Mycat(proxy中介軟體層):

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

二、Mycat分區join

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

1.)分布式全域唯一id

2.)分區規則和策略

3.)跨分區技術問題

4.)跨分區事物問題

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

1. 使用全域表方式解決跨分區join問題

1.1 先在server.xml裡面全域表一致性檢測

<property name="useGlobleTableCheck">1</property>  <!-- 1為開啟全域表一致性檢測、0為關閉 -->

1.2 在schema.xml裡面配置全域表

<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />

全域表說明:

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裡面的配置

<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">    <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">            <childTable name="order_items" joinKey="order_id" parentKey="id" />    </childTable>    <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" /></table>

說明:

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裡面開啟使用非堆記憶體。否則記憶體會爆掉

<property name="useOffHeapForMerge">1</property>

最佳化:

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

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 * from travelrecord;(強制走主庫)/*!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');

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.