在使用數據庫中間件以前,我就想到分庫分表的操做對於聯表操做可能會顯得很是複雜。由於若是數據是分片存儲的,若是主表的數據在1分片,從表對應的數據在2分片,那麼這一次聯表查詢就須要跨節點,若是業務再複雜一點,顯然會形成沒必要要的性能損耗。今天在研究mycat文檔的時候看到mycat很巧妙的解決了這個問題:數據庫
」MyCAT借鑑了NewSQL領域的新秀Foundation DB的設計思路,Foundation DB創新性的提出了Table Group的概念,其將子表的存儲位置依賴於主表,而且物理上緊鄰存放,所以完全解決了JION的效率和性能問題,根據這一思路,提出了基於E-R關係的數據分片策略,子表的記錄與所關聯的父表記錄存放在同一個數據分片上。「性能
目前有兩個表:tab_user(id,name) 和 tab_orders(id,user_id), tab_user中的id做爲orders中的外鍵。spa
在schema.xml進行配置: 設計
<table name="tab_user" dataNode="dn1,dn2" rule="mod-long"> <childTable name="tab_orders" joinKey="user_id" parentKey="id"/> </table>
這段配置代碼,告訴了mycat將tab_orders的user_id和tab_user的id關聯起來,在對orders表進行插入操做時,將會判斷插入數據的user_id處於哪個分片,而後將數據插入該分片,這樣便實現了將關聯數據存放在一個分片的目的。固然,若是關聯了更多的表,就繼續在childTable下面配置childTable.code