Mycat分库分表

本文详细介绍了Mycat的分库分表配置,包括数据节点配置、分片规则设定,如sharding-by-intfile、固定分片hash算法等。同时,讨论了全局表的使用,以减少跨库JOIN,并讲解了ER分片表的应用,确保关联数据在同一分片。此外,文章还提及了多对多关联场景的挑战以及自增主键的配置和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据节点配置

[schema.xml]配置

 <dataNode name="dn1" dataHost="localhost1" database="db1"/>
 <dataNode name="dn2" dataHost="localhost1" database="db2"/>
 <dataNode name="dn3" dataHost="localhost1" database="db3"/>

把localhost1中的 db1-3 数据库映射到mycat dn1-3 节点

mycat分片规则

  1. 规则种类,在rule.xml文件中

    <table name="t_config" primaryKey="id" dataNode="dn1,dn2" rule="规则名" />
    • sharding-by-intfile 分片枚举
    • rule1 固定分片hash算法
    • auto-sharding-long 范围约定
    • mod-long 取模
    • sharding-by-date 按日期(天)分片
    • ………….
  2. mycat全局表
    如果你的业务中有些数据类似于数据字典,比如配置文件的配置,常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,而且大部分的业务场景都会用到,那么这种表适合于 Mycat全局表,无须对数据进行切分,只要在所有的分片上保存一份数据即可,Mycat 在Join 操作中,业务表与全局表进行Join聚合会优先选择相同分片内的全局表join,避免跨库 Join,在进行数据插入操作时,mycat将把数据分发到全局表对应的所有分片执行,在进行数据读取时候将会随机获取一个节点读取数据。
    配置[schema.xml]

    <table name="t_config" primaryKey="id" type="global" dataNode="dn1,dn2" />
  3. ER分片表
    有一类业务,例如订单(order)跟订单明细(order_detail),明细表会依赖于订单,也就是说会存在表的主从关系,这类似业务的切分可以抽象出合适的切分规则,比如根据用户 ID切分,其他相关的表都依赖于用户ID,再或者根据订单ID切分,总之部分业务总会可以抽象出父子关系的表。这类表适用于 ER分片表,子表的记录与所关联的父表记录存放在同一个数据分片上,避免数据 Join跨库操作。
    以order与 order_detail例子为例,schema.xml中定义如下的分片配置,order,order_detail 根据 order_id进行数据切分,保证相同 order_id的数据分到同一个分片上,在进行数据插入操作时,Mycat会获取 order所在的分片,然后将 order_detail也插入到 order所在的分片。
    配置[schema.xml]

    <table name="t_order" primaryKey="id" dataNode="dn$1-3" rule="mod-long">
       <childTable name="t_order_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
    </table>
  4. 多对多关联
    有一类业务场景是 “主表A+关系表+主表B”,举例来说就是商户会员+订单+商户,对应这类业务,如何
    切分? 从会员的角度,如果需要查询会员购买的订单,那按照会员进行切分即可,但是如果要查询商户当天售出的订单,那又需要按照商户做切分,可是如果既要按照会员又要按照商户切分,几乎是无法实现,这类业务如何选择切分规则非常难。目前还暂时无法很好支持这种模式下的3个表之间的关联。目前总的原则是需要从业务角度来看,关系表更偏向哪个表,即“A的关系”还是“B的关系”,来决定关系表跟从那个方向存储,未来 Mycat版本中将考虑将中间表进行双向复制,以实现从A-关系表 以及B-关系表的双向关联查询。

自增主键使用

  1. mycat配置

    [schema.xml]

    <table name="t_order" primaryKey="id" autoIncrement="true" dataNode="dn$1-3" rule="mod-long">
        <childTable name="t_order_detail" primaryKey="id" autoIncrement="true" joinKey="order_id" parentKey="id" />
    </table>

    [sequence_db_conf.properties]

    
    #TABLE=dataNode
    
    T_ORDER_DETAIL=dn1
    T_ORDER=dn1

    [sequence_conf.properties]

    T_ORDER.CURID=0
    T_ORDER.MINID=1
    T_ORDER.MAXID=10000
    T_ORDER_DETAIL.CURID=0
    T_ORDER_DETAIL.MINID=1
    T_ORDER_DETAIL.MAXID=10000

    CURID表示当前ID值,MINID表示最小ID值,MAXID表示最大ID值

  2. 重启mycat,执行sql

    
    #创建数据库
    
    create table t_order(id bigint not null auto_increment primary key,company varchar(255))AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    create table t_order_detail(id bigint not null auto_increment primary key,good varchar(255),order_id bigint,CONSTRAINT FK_ORDID11 FOREIGN KEY (ORDER_ID) REFERENCES T_ORDER (ID))AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    
    
    #插入数据
    
    insert into t_order(company) values('alibaba');
    insert into t_order(company) values('tencent');
    insert into t_order(company) values('baidu');
    
    insert into t_order_detail(good,order_id) values('aliyun',1);
    insert into t_order_detail(good,order_id) values('qq',2);   
    insert into t_order_detail(good,order_id) values('baiduyun',3);

    这里写图片描述

    这里写图片描述

  3. 结论
    登陆mysql查看db1-3的记录,可以发现,三条order记录在不同db上,order_detail的记录与所关联的order表记录存放在同一个数据分片上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值