1.尽量使用一个分片字段
- 考虑字段之间的关系,可以从非分片字段取出分片字段的信息,例如基因法
- 考虑字段之间的关系,两个字段的值有相同的信息,那么两个字段可以共用一个分片算法计算逻辑
- 多个字段合成一个分片字段,该字段做冗余,在物理表中存储,后面mycat2会支持虚拟字段,例如标签,就不需要存储该字段值
2.涉及多个分片字段的时候
以分 MySQL,database(schema),table三个层次考虑,以M字段分数据库,D字段分物理库,T字段分物理表,每个字段对应一个范围,按字段逐级缩小扫描范围
- 考虑条件只有M字段,怎么映射?
- 考虑条件只有D字段,怎么映射?
- 考虑条件只有T字段,怎么映射?
- 考虑条件只有(M,D),(D,T),(M,T),(M,D,T)字段,怎么映射?
- 没有分片条件的时候怎么映射?
3.涉及随着时间变动的分片范围
- 所有物理表的映射信息(没有分片条件),每天随着天数的变动
- 映射规则每天都随着天数变动,昨天的查询结果与今天不相同
- 物理表可能每天都要做数据迁移,冷热归档
4.使用全局二级索引
全局二级索引使用不同的分片规则 冗余存储 逻辑表的数据,来实现逻辑表可以使用多个分片规则
id是主键
普通的逻辑分片表
逻辑分片表(id,user_code,user_name)->分片键id->物理表(id,user_code,user_name)
带有全局二级索引的逻辑分片表
全局二级索引在跨库情况下对事务有要求,尽量使用单库分表(不跨库),或者避免事务
例子1
逻辑分片表(id,user_code,user_name)->分片键id->物理表(id,user_code,user_name) ------------------a
逻辑分片表(id,user_code,user_name)->分片键user_code->物理表(id,user_code)----------------------b
查询select user_name from travelrecord where user_code = '0001'会先查询b,
然后根据是否需要补列根据id查询a的user_name,不建议
查询select id,user_code from travelrecord where user_code = '0001'会先查询b就直接返回,
建议
例子2
逻辑分片表(id,user_code,user_name)->分片键id->物理表(id,user_code,user_name) ------------------a
逻辑分片表(id,user_code,user_name)->分片键user_code->物理表(id,user_code)----------------------b
逻辑分片表(id,user_code,user_name)->分片键user_name->物理表(id,user_name)----------------------c
查询select id,user_name,user_code from travelrecord where user_name = 'zhangsan'会先查询c,
然后根据id查询a的user_code
不建议
查询select id,user_name from travelrecord where user_name = 'zhangsan'会先查询c就直接返回,
建议
例子3
逻辑分片表(id,user_code,user_name)->分片键id->物理表(id,user_code,user_name) ------------------a
逻辑分片表(id,user_code,user_name)->分片键user_code->物理表(id,user_code,user_name)----------b
查询select user_name from travelrecord where user_code = '0001'会先查询b,直接返回,建议
5.使用Mycat的schema切换注释
/*+mycat:schema=ds2*/是语句作用的注释,实现不通过use schema临时修改当前的schema
select DATABASE();//mysql库
/*+mycat:schema=ds2*/select DATABASE()");//ds2
select DATABASE();//恢复到mysql库
设计如下逻辑库,逻辑表到物理表映射
8066.db1.user -> 3306.db1.user
8066.db2.user -> 3307.db1.user
然后在应用层做一个动态添加注释/+mycat:schema=ds2/
来实现多租户分片
6.使用Mycat的分表功能结合MySQL分区表(即Mycat1.6的分库)
使用Mycat的分片字段,它一般使用业务类型强相关的字段分片,比如枚举,
或者有限的范围字段值作为分片字段,
或者用户ID作为分片字段
然后使用MySQL的分区表对时间类型进行分区