全局表
在项目中,有很多表很少会有改动,并且数据量也不大,比如一些字典表,这些表根本用不到分片。而且每次查询的时候都需要关联起来。如果进行分片,那么在查询的时候还需要将所有的字典表都查询一遍,所以,为了解决这个问题,就在每个库中都保存一份,这些表就叫做全局表。这样做的好处就是,在进行关联查询的时候,只需要关联当前的库即可
设置方法
设置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
启动mycat,添加两条数据
查看另外两个节点表的数据
都添加了相同的数据
子表
在实际项目中,会有一个主体表和一些关联表,比如说订单表,在创建一个订单的时候,同时会将订单的各种信息存放在不同的表中,主表中包含订单创建的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
启动mycat,并添加两条数据
根据分片规则,两条数据应该分别落在两个库中
查询节点一的数据库,根据分片规则,应该保存id为1的订单
查询节点二的数据库,根据分片规则,应该保存id为6000000的订单
结果符合预期