1 问题
在实际的业务中,有些表中的数据非常稳定,几乎不会发生更新,比如用来存储行政区划数据,或者国家地区数据,这些数据稳定的表,也被称为字典表。
字典表的特征:
- 变动不频繁
- 总体数据量变化不大
- 数据规模不大,一般多在十万条以内
那么在实现了分片的情况时,对业务数据进行分片后,业务表与这些字典表之间如果需要进行关联查询,此时就成为了一个亟需解决的问题。
2 全局表
为了解决上述问题,在Mycat中引入了全局表。
全局表在mycat中的特征:
- 全局表的插入更新等操作,会实时在所有节点上执行,保持各个分片的数据一致
- 全局表的查询操作,仅从一个节点执行
- 全局表可以和任何一个表进行JOIN操作
通过全局表以上特征,不难看出,通过全局表的使用,也能很好的解决分片数据在查询中遇到的 JOIN 难题。通过全局表和ER表的分片策略,可以解决工作中遇到的绝大多数问题。
3 实施
3.1 修改 schema.xml 配置
在 schema.xml 中配置全局表信息。
在 xml 文件中 schema 节点下增加如下一行配置信息:
<table name="dict_order_type" dataNode="dn1,dn2" type="global"></table>
配置信息中
- name 要配置的全局表的名称
- dataNode 希望全局表保存到哪些分片
- type 数据表的类型,全局表类型为 global
修改后的配置文件如下
3.2 重启mycat服务
mycat restart
3.3 创建字典表
因为在配置中定义的字典表 dict_order_type 之前不存在,现在需要把它创建出来。
登录到mycat数据端口
mysql -uroot -p123456 -h192.168.137.3 -P8066
选择 TESTDB 数据库
use TESTDB;
创建字典表
create table dict_order_type(id int auto_increment primary key, order_type varchar(200));
在mycat中创建该表后,将在两个节点中同时创建出该表。
注意:
由mycat创建的数据表,在mysql中表名为全大写。在查询时,表名也需要全大写,否则查询报错。
mycat中的数据表
dn1中的数据表
dn2中的数据表
3.4 插入数据
在mycat中执行数据插入操作
insert into DICT_ORDER_TYPE values(1, "Order");
insert into DICT_ORDER_TYPE values(2, "Refund");
插入后,进行查询
在mycat中的查询结果
dn1中的查询结果
dn2中的查询结果
可以发现,作为全局表,它的数据将被插入到配置文件中配置的所有分片中。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!