跨库关联问题
分库分表后,表之间的关联操作受到限制,无法Join位于不同分库的表。 可以通过如下方式来解决.
- 应用层组装:在数据库层面无法关联可以在应用层调用远程接口数据后利用应用逻辑关联
- ER表:所谓的ER表就是考虑将其他表也一样纳入分库分表的逻辑来。比如主表和扩展表都纳入同一个分库分表体系中,根据分片键号也可以查扩展表。
- 字段冗余: 将其他表很少变动的字段直接冗余到分库分表中。
- 大数据聚合成宽表或es聚合:在业务系统不直接关联,通过大数据平台或异构数据关联。
事务问题
分库分表之后带来因为跨库不支持事务而导致的数据一致性的问题。一般考虑分布式事务解决方案或者是否可以将其他表纳入分库分表体系中
排序分页
做了分库分表之后,以前单表中很方便的分页查询、排序等等操作就都失效了。因为我们不能跨多表进行分页、排序。
- 可以借助ES聚合成宽表进行分页排序。
- 有条件的走大数据平台合并成宽表进行分页和排序。
非分片键查询
以电商订单分库分表为例,除了如果按买家id分库分表,则其他字段就无法路由导致全表扫描。可以通过以下几种方式解决
用户侧解决方案
基因法:比如订单号后4位为买家id,只按订单号查询的情况,可以有路由的买家id信息。这种方式一般只对某个常用或关键字段应用。
索引表:维护一个非分片键到分片键的路由关系,可以多个维度创建多个异构索引表,索引表也要分库分表。具体可以采用数据库表映射或缓存redis映射。如果更方便一点可以将数据存入分布式数据库中,比如OceanBase或TiDB中。
冗余双写:可以理解为索引表的升级版,比如按买家分库分表后,再通过binlog数据同步,异构一个卖家的分库分表。
其他:函数生成,比如根据userName按照一定规则生成userid
运营侧解决方案
运营侧非分片键查询场景,可以通过binlog异构数据到es解决。