Mycat的表分片配置是經過table標籤來完成的mysql
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" ></table>
Table 標籤訂義了 MyCat 中的邏輯表,全部須要拆分的表都須要在這個標籤中定義。sql
定義邏輯表的表名,這個名字就如同咱們在數據庫中執行create table命令指定的名字同樣,同一個schema標籤中定義的名字必須惟一。數據庫
定義這個邏輯表所屬的 dataNode, 該屬性的值須要和 dataNode 標籤中 name 屬性的值相互對應。若是需 要定義的 dn 過多 可使用以下的方法減小配置:緩存
<table name="travelrecord" dataNode="multipleDn$0-99,multipleDn2$100-199" rule="auto-sharding-long" ></table> <dataNode name="multipleDn$0-99" dataHost="localhost1" database="db$0-99" ></dataNode> <dataNode name="multipleDn2$100-199" dataHost="localhost1" database=" db$100-199" ></dataNode>
這裏須要注意的是 database 屬性所指定的真實 database name 須要在後面添加一個,例如上面的例子中, 我須要在真實的 mysql 上創建名稱爲 dbs0 到 dbs99 的 database。ui
該屬性用於指定邏輯表要使用的規則名字,規則名字在 rule.xml 中定義,必須與 tableRule 標籤中 name 屬 性屬性值一一對應。code
該屬性用於指定表是否綁定分片規則,若是配置爲 true,但沒有配置具體 rule 的話 ,程序會報錯。xml
該邏輯表對應真實表的主鍵,例如:分片的規則是使用非主鍵進行分片的,那麼在使用主鍵查詢的時候,就 會發送查詢語句到全部配置的 DN 上,若是使用該屬性配置真實表的主鍵。難麼 MyCat 會緩存主鍵與具體 DN 的 信息,那麼再次使用非主鍵進行查詢的時候就不會進行廣播式的查詢,就會直接發送語句給具體的 DN,可是儘管 配置該屬性,若是緩存並無命中的話,仍是會發送語句給具體的 DN,來得到數據。blog
該屬性定義了邏輯表的類型,目前邏輯表只有「全局表」和」普通表」兩種類型。對應的配置: 全局表:global;普通表:不指定該值爲 globla 的全部表。ip
以下是全局表的配置,每一個分片上這個表的數據都是同樣的。rem
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
mysql 對非自增加主鍵,使用 last_insert_id()是不會返回結果的,只會返回 0。因此,只有定義了自增加主 鍵的表才能夠用 last_insert_id()返回主鍵值。mycat 目前提供了自增加主鍵功能,可是若是對應的 mysql 節點上數據表,沒有定義 auto_increment,那 麼在 mycat 層調用 last_insert_id()也是不會返回結果的。因爲 insert 操做的時候沒有帶入分片鍵,mycat 會先取下這個表對應的全局序列,而後賦值給分片鍵。這樣才能正常的插入到數據庫中,最後使用 last_insert_id()纔會返回插入的分片鍵值。若是要使用這個功能最好配合使用數據庫模式的全局序列。 使用 autoIncrement=「true」 指定這個表有使用自增加主鍵,這樣 mycat纔會不拋出分片鍵找不到的異常。使用 autoIncrement=「false」 來禁用這個功能,固然你也能夠直接刪除掉這個屬性。默認就是禁用的。
childTable 標籤
插入子表的時候會使用這個列的值查找父表存儲的數據節點。
屬性指定的值通常爲與父表創建關聯關係的列名。程序首先獲取 joinkey 的值,再經過 parentKey 屬性指定 的列名產生查詢語句,經過執行該語句獲得父表存儲在哪一個分片上。從而肯定子表存儲的位置。
同 table 標籤所描述的。