1.尽量使用一个分片字段

  1. 考虑字段之间的关系,可以从非分片字段取出分片字段的信息,例如基因法
  2. 考虑字段之间的关系,两个字段的值有相同的信息,那么两个字段可以共用一个分片算法计算逻辑
  3. 多个字段合成一个分片字段,该字段做冗余,在物理表中存储,后面mycat2会支持虚拟字段,例如标签,就不需要存储该字段值

2.涉及多个分片字段的时候

以分 MySQL,database(schema),table三个层次考虑,以M字段分数据库,D字段分物理库,T字段分物理表,每个字段对应一个范围,按字段逐级缩小扫描范围

  1. 考虑条件只有M字段,怎么映射?
  2. 考虑条件只有D字段,怎么映射?
  3. 考虑条件只有T字段,怎么映射?
  4. 考虑条件只有(M,D),(D,T),(M,T),(M,D,T)字段,怎么映射?
  5. 没有分片条件的时候怎么映射?

3.涉及随着时间变动的分片范围

  1. 所有物理表的映射信息(没有分片条件),每天随着天数的变动
  2. 映射规则每天都随着天数变动,昨天的查询结果与今天不相同
  3. 物理表可能每天都要做数据迁移,冷热归档

4.使用全局二级索引

全局二级索引使用不同的分片规则 冗余存储 逻辑表的数据,来实现逻辑表可以使用多个分片规则

id是主键

  1. 普通的逻辑分片表
  2. 逻辑分片表(id,user_code,user_name)->分片键id->物理表(id,user_code,user_name)

带有全局二级索引的逻辑分片表

全局二级索引在跨库情况下对事务有要求,尽量使用单库分表(不跨库),或者避免事务

例子1

  1. 逻辑分片表(id,user_code,user_name)->分片键id->物理表(id,user_code,user_name) ------------------a
  2. 逻辑分片表(id,user_code,user_name)->分片键user_code->物理表(id,user_code)----------------------b
  3. 查询select user_name from travelrecord where user_code = '0001'会先查询b,
  4. 然后根据是否需要补列根据id查询auser_name,不建议
  5. 查询select id,user_code from travelrecord where user_code = '0001'会先查询b就直接返回,
  6. 建议

例子2

  1. 逻辑分片表(id,user_code,user_name)->分片键id->物理表(id,user_code,user_name) ------------------a
  2. 逻辑分片表(id,user_code,user_name)->分片键user_code->物理表(id,user_code)----------------------b
  3. 逻辑分片表(id,user_code,user_name)->分片键user_name->物理表(id,user_name)----------------------c
  4. 查询select id,user_name,user_code from travelrecord where user_name = 'zhangsan'会先查询c,
  5. 然后根据id查询auser_code
  6. 不建议
  7. 查询select id,user_name from travelrecord where user_name = 'zhangsan'会先查询c就直接返回,
  8. 建议

例子3

  1. 逻辑分片表(id,user_code,user_name)->分片键id->物理表(id,user_code,user_name) ------------------a
  2. 逻辑分片表(id,user_code,user_name)->分片键user_code->物理表(id,user_code,user_name)----------b
  3. 查询select user_name from travelrecord where user_code = '0001'会先查询b,直接返回,建议

5.使用Mycat的schema切换注释

  1. /*+mycat:schema=ds2*/是语句作用的注释,实现不通过use schema临时修改当前的schema
  2. select DATABASE();//mysql
  3. /*+mycat:schema=ds2*/select DATABASE()");//ds2
  4. select DATABASE();//恢复到mysql

设计如下逻辑库,逻辑表到物理表映射

  1. 8066.db1.user -> 3306.db1.user
  2. 8066.db2.user -> 3307.db1.user

然后在应用层做一个动态添加注释/+mycat:schema=ds2/
来实现多租户分片

6.使用Mycat的分表功能结合MySQL分区表(即Mycat1.6的分库)

使用Mycat的分片字段,它一般使用业务类型强相关的字段分片,比如枚举,
或者有限的范围字段值作为分片字段,
或者用户ID作为分片字段
然后使用MySQL的分区表对时间类型进行分区