分库分表带来的问题
1 跨库关联查询
在单库未拆分表之前,我们可以很方便使用 join 操作关联多张表查询数据,
但是经过分库分表后两张表可能都不在一个数据库中,
如何使用 join 呢? 有几种方案可以解决:
字段冗余:把需要关联的字段放入主表中,避免 join 操作;
数据抽象:通过ETL等将数据汇合聚集,生成新的表;
全局表:比如一些基础表可以在每个数据库中都放一份;
应用层组装:将基础数据查出来,通过应用程序计算组装;
2 分布式事务
单数据库可以用本地事务搞定,使用多数据库就只能通过分布式事务解决了。
常用解决方案有:=基于可靠消息(MQ)的解决方案、两阶段事务提交、柔性事务等。=
3 排序、分页、函数计算问题
在使用 SQL 时 order by, limit 等关键字需要特殊处理,一般来说采用分片的思路:
先在每个分片上执行相应的函数,然后将各个分片的结果集进行汇总和再次计算,最终得到结果。
4 分布式id
如果使用 Mysql 数据库在单库单表可以使用 id 自增作为主键,分库分表了之后就不行了,会出现id 重复。
常用的分布式 ID 解决方案有:
UUID 基于数据库自增单独维护一张 ID表 号段模式
Redis 缓存 雪花算法(Snowflake) 百度uid-generator
美团Leaf
滴滴Tinyid
5 多数据源
分库分表之后可能会面临从多个数据库或多个子表中获取数据,一般的解决思路有:客户端适配和代理层适配。
业界常用的中间件有:
shardingsphere(前身 sharding-jdbc)
Mycat
我对任何唾手而得,快速,出自本能,即兴,含混的事物没有信心。我相信缓慢,平和,细水长流的力量,踏实,冷静。我不相信缺乏自律精神和不自我建设,不努力,可以得到个人或集体的解放。