Mycat水平分表

美食江湖發表於2020-11-23

一、 水平分表

1、選擇水平分表

  • 訂單表orders表已經有600萬資料超過MySQL單表資料瓶頸,需要進行水平分表
  • 鑑於訂單表特性,無論是按照id、時間進行分表均不合適,應該保證每個人的訂單在同一張表裡。所以應該按照客戶id(customer_id)進行分表,具體做法:按照客戶id取模平均分配到兩張表裡。

Java培訓Mycat水平分表

2、配置檔案修改

  • 修改配置檔案schema.xml

<?xml version=”1.0″?>

<!DOCTYPE mycat:schema SYSTEM “schema.dtd”>

<mycat:schema xmlns:mycat=”http://io.mycat/”>

<schema name=”TESTDB” checkSQLschema=”false” sqlMaxLimit=”100″ dataNode=”dn1″>

<table name=”customer” dataNode=”dn2″ ></table>

<table name=”orders” dataNode=”dn1,dn2″ rule=”mod_rule” ></table>

</schema>

<dataNode name=”dn1″ dataHost=”host1″ database=”atguigu_mc” />

<dataNode name=”dn2″ dataHost=”host2″ database=”atguigu_sm” />

<dataHost name=”host1″ maxCon=”1000″ minCon=”10″ balance=”2″

writeType=”0″ dbType=”mysql” dbDriver=”native” switchType=”1″ slaveThreshold=”100″>

<heartbeat>select user()</heartbeat>

<writeHost host=”hostm1″ url=”192.168.67.1:3306″ user=”root”

password=”123123″>

</writeHost>

</dataHost>

<dataHost name=”host2″ maxCon=”1000″ minCon=”10″ balance=”0″

writeType=”0″ dbType=”mysql” dbDriver=”native” switchType=”1″ slaveThreshold=”100″>

<heartbeat>select user()</heartbeat>

<writeHost host=”hostm2″ url=”192.168.67.1:3306″ user=”root”

password=”123123″>

</writeHost>

</dataHost>

  • 修改配置檔案rule.xml

<tableRule name=”mod_rule”>

<rule>

<columns>customer_id</columns>

<algorithm>mod-long</algorithm>

</rule>

</tableRule>

……

<function name=”mod-long” class=”io.mycat.route.function.PartitionByMod”>

<!– how many data nodes –>

<property name=”count”>2</property>

</function>

Java培訓Mycat水平分表

3、重啟Mycat

先在另一個庫裡建立訂單表,之後重啟Mycat,讓新配置生效

Java培訓Mycat水平分表

4、 驗證

  • 連線Mycat向訂單表插入資料

注:表名後必須加上相關欄位,告知Mycat,哪個欄位是customer_id

INSERT INTO orders(id,order_type,customer_id,amount) values(1,101,100,100100);

INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);

INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);

INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);

INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);

INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);

  • 執行成功後,分別去兩個資料庫檢視,兩個客戶的訂單已分到兩個表裡。

Java培訓

相關文章