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