mycat 水平分表

2022-04-16 07:16:08 字數 2677 閱讀 8899

相對於垂直拆分的區別是:垂直拆分是把不同的表拆到不同的資料庫中,而水平拆分是把同乙個表拆到不同的資料庫中。水平拆分不是將表的資料做分類,而是按照某個欄位的某種規則來分散到多個庫之中,每個表中包含一部分資料。

例如,分庫中的舉例,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也水平分表,但是要求實現訂單詳細記錄要和訂單記錄在同一庫中。

重啟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);

mycat水平分表

和垂直分庫不同,水平分表,是將那些io頻繁,且資料量大的表進行水平切分。基本的配置和垂直分庫一樣,我們需要改的就是我們的 schema.xml和rule.xml檔案配置 server.xml不用做任何修改 除此之外,我們還需要在兩個分片資料庫伺服器上建立分片用的資料庫10.0.4.181上建立 or...

Mycat水平分片策略(水平分表拆分)

可以實現按照地區進行分表 根據不同的列舉 常量 進行分表儲存 1.mysql中建立3個資料庫分別為user db1 user db2 user db3 2.在3個資料庫中建立3個一樣的資料表 order info order info表中有字段name 3.配置mycat環境 schema.xml ...

Mysql水平分表

mysql水平分表 mysql在資料量大的情況下,會遇到水平分表的情況。1 條件中含有分表的資訊 比如說要劃分10個表,那對10進行取模。其實也可以是任意雜湊函式,但是要注意注意衝突處理。2 根據時間拆表 當表的關係比較複雜時,無法根據某個維度進行分表。但是有明顯的時效性。想必大家都用微薄,某人發的...