特性
能做什么不能做什么?
- 语法支持
- 不支持DUAL虚拟表
- mycat会认为是一个实际表
- 函数/存储过程支持程度
- 内置函数支持
- 自定义函数支持有限,不建议使用
- 结论尽量不要使用,和实际结果差异比较大,需要考虑很多场景才能使用正确
- 执行效果说明
- 函数内部定义的sql只会本数据节点中执行,不会经过数据库中间件进行路由
- 对于count这种语句,执行出来的结果必定是错误的
- 如果使用select self_func();可以执行,但是从执行的效果上看是随机分配到一个数据分片上执行,是错误的
- select self_func() from single_table 这种是可以使用,只要函数存在单片表所在的数据库中
- select self_func() from sharding_table 这种情况
- 如果函数都存在执行不会有问题,只是执行不会问题,但是执行的结果,要看具体的函数执行的结果
- 如果函数没有都存在,则执行会报错
- 函数内部定义的sql只会本数据节点中执行,不会经过数据库中间件进行路由
- join支持
- 全局表
- 数据同步
- 对全局表的操作,会到具体的数据节点上执行
- 单独对单一库操作不会同步到其他库,但是如果每个库都有数据会在全局表查询中也会体现,否则不体现
- 支持分片表join 最后会合并结果集
- 支持单库表join
- 数据同步
- 分片表
- 指定一个冗余的、相同的分片键
- 这样rule规则只需要一个,否则每个表都需要配置一个rule规则
- rule需要指定column,sharding_id相同,就能保证数据落到相同分片上
- 这样rule规则只需要一个,否则每个表都需要配置一个rule规则
- 分片键设置方式
- 通过业务代码自己指定分片键,业务代码需要注意分片键设置
- 通过平台自动设置 不建议,因为如果分片策略有很多中的情况,不是很好设置
- 支持分片表join 但必须在相同分片策略,关联查询可以正常查询,从结果上看是做了结果集的合并
- 不支持笛卡尔积
- 不会做跨库笛卡尔积
- 各自笛卡尔然后合并
- 不支持单片表join,只会查询到部分数据,所以查询需要
- 指定一个冗余的、相同的分片键
- e-r关系表
- 目前看不太需要e-r分片表
- 只需要一般的分片表即可
- 优点,只需要设置主表的分片键,而对应子表的分片键只需要通过关联关系来配置
- 拆分策略
- in的方式还是?
- 全局表
- 存储过程支持
- 聚合运算
- insert into … select 支持有限,不建议使用
- 部分支持,通过hint,但是支持select的结果都在一个分片内
- /!mycat: sql=select * from test where test_id = 2/insert into test select * from test_temp ;
- 同时要求了解分片的原则
- 不支持DUAL虚拟表
- 全局索引
- 分库分表
- 注释
- 解决不支持的sql如insert into …select
- 存储过程调用
- 同一个实例内的跨库关联查询,如用户库和平台库内的表关联
- 分布式事务
- 不支持语法
- 复杂子查询 不建议使用,建议拆分sql
- 跨库join
- 分片表笛卡尔积
- 单片表和分片表
- 不同分片的分片表关联查询
- 不同分片单片表
- 自定义函数 部分支持,不建议使用,只有部分场景支持
- 不支持from dual
- insert
- insert into …select 部分支持,不建议使用
- 分片表必须insert字段中包含分片键
- 多行插入 insert into tab_a(c1,c2) values(v1,v2),(v11,v21)… ##针对的是ER分表的从表无法批量插入
- update
- 不能更新分片字段,只能删除后新增
- 多表更新,一般用不到
最佳实践
- 分片策略
- 大表分片
- 数据量操作2000w为准
- 管理紧密的表需要一起分片,即使数据不大
- 这个联系讲的是业务层面的联系
- 多个关联
- 通过一个外部的sharding_id
- 手动设置sharding_id
- 单片表
- 小表不分片,且和分片表关联不大,且不符合全局表场景
- 关系指业务层面的关系
- 小表不分片,且和分片表关联不大,且不符合全局表场景
- 全局表
- 变化不大的配置表,
- 常规意义上的配置表规格表,如区域,主数据之类
- e-r表
- 目前看并没有实际使用的意义
- 如果要用就是可以以配置替换分片策略
- 大表分片
- 数据库创建
- 物理数据库
- schema也携带上分片信息和dn一致
- dataHost
- 数据库名使用ip和端口命名
- dh_ip_port
- 数据库名使用ip和端口命名
- dataNode
- 表达物理概念
- dn_ip_port_schema
- 表达中心概念 推荐
- center01
- 表达物理概念
- 物理数据库
方案
- 使用er表还是分片表?
运维监控
部署集成
- 数据扩容方案
- 分片算法
- 一致性hash
- 有现成的数据迁移方案
- io.mycat.util.rehasher.RehashLauncher
- 有现成的数据迁移方案
- 无序迁移方案
- 一致性hash
- 分片算法