Mycat-全局表和子表

全局表

在项目中,有很多表很少会有改动,并且数据量也不大,比如一些字典表,这些表根本用不到分片。而且每次查询的时候都需要关联起来。如果进行分片,那么在查询的时候还需要将所有的字典表都查询一遍,所以,为了解决这个问题,就在每个库中都保存一份,这些表就叫做全局表。这样做的好处就是,在进行关联查询的时候,只需要关联当前的库即可

设置方法

设置type属性为global即为全局表,不设置为分片表

案例

在两个库中,分别创建province表

CREATE TABLE province (
  province_id int(11) NOT NULL,
  province_name varchar(255) DEFAULT NULL,
  PRIMARY KEY (province_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

创建完成后,修改对应schema.xml配置,配置type为global
file

启动mycat,添加两条数据
file

查看另外两个节点表的数据
file
都添加了相同的数据

子表

在实际项目中,会有一个主体表和一些关联表,比如说订单表,在创建一个订单的时候,同时会将订单的各种信息存放在不同的表中,主表中包含订单创建的id信息,关联表中存放订单的详细信息等等,我们在分片的时候,就不能将他们单独进行分片,以防止订单主体数据和订单的关联数据存放到了不同的数据库,在查询的时候,需要将所有的库都查询一遍才可以。这时候就需要使用子表了,将主体数据和关联数据存放在同一个数据库中,这样在进行查询的时候,就不需要多余的查询了

设置方法

childTabe:在table中添加childTabe标签,定义为分片子表
name: 子表名称
joinkey:标志子表中的列,用于和父表做关联
parentKey: 标志父表中的列,与joinKey对应
primaryKey: 子表主键,同table标签
needAddLimit: 同table标签

案例

在库中分别创建order表和order_item表

CREATE TABLE order (
  id int(11) NOT NULL,
  total_amount decimal(10,2) DEFAULT NULL,
  order_status int(1) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE order_item (
  id int(11) NOT NULL,
  order_id int(11) DEFAULT NULL,
  product_name varchar(255) DEFAULT NULL,
  num int(11) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

配置schema.xml
file

启动mycat,并添加两条数据
file

根据分片规则,两条数据应该分别落在两个库中
查询节点一的数据库,根据分片规则,应该保存id为1的订单
file
file

查询节点二的数据库,根据分片规则,应该保存id为6000000的订单
file
file

结果符合预期

发表回复