相對於垂直拆分的區別是:垂直拆分是把不同的表拆到不同的數據庫中,而水平拆分是把同一個表拆到不同的數據庫中。水平拆分不是將表的數據做分類,而是按照某個字段的某種規則來分散到多個庫之中,每個表中包含一部分數據。
例如,分庫中的舉例,orders表水平分到order_win和order_linux兩個庫中。
配置mycat的schema.xml
確認兩個庫中都有orders表,沒有就新建下。
配置rule, vim /usr/local/mycat/conf/rule.xml
重啟mycat,在mycat中執行測試插入數據。
insert into orders(id,order_type,customer_id,amount)values(1,1,1,1000.00);
insert into orders(id,order_type,customer_id,amount)values(2,1,2,1000.00);
insert into orders(id,order_type,customer_id,amount)values(3,1,3,1000.00);
insert into orders(id,order_type,customer_id,amount)values(4,1,4,1000.00);
insert into orders(id,order_type,customer_id,amount)values(5,1,5,1000.00);
insert into orders(id,order_type,customer_id,amount)values(6,1,6,1000.00);
結果:兩個庫中的orders各有一部分數據。是根據customer_id通過mod-long算法,計算出要插入哪個庫的哪個orders表。
此時有個問題,orders表已經水平分表,然而orders_detail表並沒有;此時如果做這兩個表的關聯查詢會報錯,因為部分數據不能找到表。
解決思路:把orders_detail也水平分表,但是要求實現訂單詳細記錄要和訂單記錄在同一庫中。
修改:schema.xml,並建立相關表,我的是在orders_linux下創建order_detail。
重啟mycat,執行。
insert into orders_detail(id,detail,order_id)values(1,"球鞋一雙",1);
insert into orders_detail(id,detail,order_id)values(2,"牙膏1",2);
insert into orders_detail(id,detail,order_id)values(3,"牙刷2",2);
insert into orders_detail(id,detail,order_id)values(4,"T恤",3);
insert into orders_detail(id,detail,order_id)values(5,"手套",3);
insert into orders_detail(id,detail,order_id)values(6,"帽子",3);
insert into orders_detail(id,detail,order_id)values(7,"金克斯",4);
insert into orders_detail(id,detail,order_id)values(8,"盧錫安",4);
insert into orders_detail(id,detail,order_id)values(9,"諾克",5);
insert into orders_detail(id,detail,order_id)values(10,"盲僧",6);
insert into orders_detail(id,detail,order_id)values(11,"狼人",6);
insert into orders_detail(id,detail,order_id)values(12,"趙信",6);
結果:有關此訂單的詳細記錄就會進入同一個庫中。
此時訂單有狀態,描述狀態的表,在每個庫中都有用,所以需要每個用到的庫都保留一份。也稱作全局表。
》對於全局表,每個庫中都有一份,mycat寫操作時所有的庫都要同步更新;所以,全局表一般不能是大數據表或者頻繁修改的表。一般為字典表,系統表為宜。
全局表配置如下:
新建dict_order_type表,重啟mycat,測試插入數據。
insert into dict_order_type values(101,'付款');
insert into dict_order_type values(101,'發貨');
在mycat執行后,會發現兩個庫中的全局表dict_order_type,都會插入數據。注意id需要使用從序列表讀出的數據。
insert into orders(id,order_type,customer_id,amount)values(next value for MYCATSEQ_ORDERS,1,1,1000.00);