⚫ 垂直拆分
    ➢ 场景
    在业务系统中, 涉及以下表结构 ,但是由于用户与订单每天都会产生大量的数据, 单台服务器的数据存储及处理能力是有限的, 可以对数据库表进行拆分, 原有的数据库表如下。
    image.png
    ⚫ 垂直拆分
    ➢ 准备
    image.png
    分别在三台MySQL中创建数据库 shopping。

    ⚫ 垂直拆分
    ➢ 配置(schema.xml )
    image.png
    image.png

    ➢ 测试
    在mycat的命令行中,通过source指令导入表结构,以及对应的数据,查看数据分布情况。
    source /root/shopping-table.sql
    source /root/shopping-insert.sql
    查询用户的收件人及收件人地址信息(包含省、市、区)。
    select ua.user_id, ua.contact, p.province, c.city, r.area, ua.address
    from
    tb_user_address ua, tb_area_city c, tb_areas_provinces p, tb_areas_region r
    where
    ua.province_id = p.province
    and
    ua.city_id = c.cityid
    and
    ua.town_id = r.areaid;
    查询每一笔订单及订单的收件地址信息(包含省、市、区)。
    SELECT order_id,payment,reciver,province,city,area
    FROM
    tb_order_master o,tb_areas_provinces p,tb_areas_city c,tb_areas_region r
    WHERE
    o.receiver_province = p.provinceid
    and
    o.receiver_city = c.cityid
    and
    o.receiver_region =r.areaid;

    ➢ 全局表配置
    对于省、市、区/县表tb_areas_provinces , tb_areas_city , tb_areas_region,是属于数据
    字典表,在多个业务模块中都可能会遇到,可以将其设置为全局表,利于业务操作。
    image.png
    image.png

    ⚫ 水平拆分
    ➢ 场景
    在业务系统中, 有一张表(日志表), 业务系统每天都会产生大量的日志数据 , 单台服务器的数据存储及处理能力是有限的, 可以对数据库表进行拆分。
    image.png
    ➢ 准备
    image.png

    分别在三台MySQL中创建数据库 mycat_test。
    ➢ 配置
    image.png
    ➢ 测试
    在mycat的命令行中,执行如下SQL创建表、并插入数据,查看数据分布情况。
    CREATE TABLE tb_log(
    id bigint(20)NOT NULL COMMENT ‘ID’,
    model_name varchar(200) DEFAULT NULL COMMENT’模块名’,
    model_value varchar(200) DEFAULT NULL COMMENT ‘模块值,
    return_valuevarchar(200)DEFAULT NULL COMMENT ‘返回值”,
    return_class varchar(200)DEFAULT NULL COMMENT’返回值类型”,
    operate_uservarchar(20) DEFAULT NULL COMMENT ‘操作用户’,
    operate_timevarchar(20) DEFAULT NULL COMMENT’操作时间’,
    param_and_value varchar(500) DEFAULT NULL COMMENT’请求参数名及参数值’,
    operate_classvarchar(200) DEFAULT NULL COMMENT ‘操作类’,
    operate_method varchar(200) DEFAULT NULL COMMENT ‘操作方法”,
    cost_time bigint(20) DEFAULT NULL COMMENT ‘执行方法耗时,单位ms’,
    source int(1) DEFAULT NULL COMMENT ‘来源:1 PC , 2 Android , 3 IOS’,PRIMARY KEY (id)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

    ⚫ 分片规则-范围
    根据指定的字段及其配置的范围与数据节点的对应情况, 来决定该数据属于哪一个分片。
    image.png
    ⚫ 分片规则-范围
    image.png
    ⚫ 分片规则-取模
    根据指定的字段值与节点数量进行求模运算,根据运算结果, 来决定该数据属于哪一个分片。
    image.png
    image.png

    ⚫ 分片规则-一致性hash
    所谓一致性哈希, 相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置。
    image.png
    image.png
    ⚫ 分片规则-枚举
    通过在配置文件中配置可能的枚举值, 指定数据分布到不同数据节点上, 本规则适用于按照省份、性别、状态拆分数据等业务 。
    image.png
    image.png
    ⚫ 分片规则-应用指定
    运行阶段由应用自主决定路由到那个分片 , 直接根据字符子串(必须是数字)计算分片号。
    image.png

    image.png

    ⚫ 分片规则-固定分片hash算法
    该算法类似于十进制的求模运算,但是为二进制的操作,例如,取 id 的二进制低 10 位 与 1111111111 进行位 & 运算。
    image.png
    image.png
    ⚫ 分片规则-字符串hash解析
    截取字符串中的指定位置的子字符串, 进行hash算法, 算出分片。
    image.png
    ⚫ 分片规则-字符串hash解析
    image.png

    ⚫ 分片规则-按(天)日期分片
    image.png
    image.png
    ⚫ 分片规则-自然月
    使用场景为按照月份来分片, 每个自然月为一个分片。
    image.png
    image.png