mycat - 水平分表


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

例如,分庫中的舉例,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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM