1 全局表概述
一个真实的业务系统中,往往存在大量的类似字典表的表格,它们与业务表之间可能有关系,这种关系,可以理解为“标签”,而不应理解为通常的“主从关系”,这些表基本上很少变动,可以根据主键 ID进行缓存,下面这张图说明了一个典型的“标签关系”图:
在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,考虑到字典表具有以下几个特性:
- 变动不频繁
- 数据量总体变化不大
- 数据规模不大,很少有超过数十万条记录。
鉴于此,MyCAT定义了一种特殊的表,称之为“全局表”,全局表具有以下特性:
- 全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性
- 全局表的查询操作,只从一个节点获取
- 全局表可以跟任何一个表进行 JOIN操作
将字典表或者符合字典表特性的一些表定义为全局表,则从另外一个方面,很好的解决了数据 JOIN的难题。
通过全局表+基于E-R关系的分片策略,MyCAT可以满足80%以上的企业应用开发。
2 配置方式
全局表配置比较简单,不用写Rule规则,如下配置即可:
修改schema.xml
测试
新建全局表
CREATE TABLE sys_global(
id INT PRIMARY KEY ,
`code` VARCHAR(30) ,
codename VARCHAR(20) NOT NULL
);
查看sql的执行计划
查看插入的执行计划,如下:
EXPLAIN INSERT INTO sys_global(id,`code`,codename) VALUES(1,'sex:1','男');
EXPLAIN INSERT INTO sys_global(id,`code`,codename) VALUES(2,'sex:0','女');
发现插入到插入到3个表中
查看更新的执行计划,如下:
EXPLAIN UPDATE sys_global SET `codename`='汉子' WHERE `code`='sex:1';
EXPLAIN UPDATE sys_global SET `codename`='妹子' WHERE `code`='sex:0';
查看查询的执行计划
EXPLAIN SELECT * FROM sys_global;
每次执行所使用的数据库都不相同,可见全局表的查询是轮询。
说明
如查一个逻辑表不设置全局,也不设置路由规则,那么默认所有节点都会存数据
查询时会所以的节点数据全查询出,再汇总,会出现重复数据
新建表格
CREATE TABLE sys_global2(
id INT PRIMARY KEY ,
`code` VARCHAR(30) ,
codename VARCHAR(20) NOT NULL
);
EXPLAIN INSERT INTO sys_global2(id,`code`,codename) VALUES(1,'sex:1','男');
EXPLAIN INSERT INTO sys_global2(id,`code`,codename) VALUES(2,'sex:0','女');
执行查询语句
SELECT * FROM sys_global2;
不加全局表,不写路由,查询结果如下:
执行计划如下:
不加全局表查询的时候,为查询全部数据库,而不是轮询,而全局表在查询的时候会去轮询查某一个数据库中的表。