分库分表后面临的问题
事务支持
- 分库分表后,就成了分布式事务了。
- 如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;
- 如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。
多库结果集合并(group by
,order by
)
跨库join
- 分库分表后表之间的关联操作将受到限制,我们无法
join
位于不同分库的表,也无法join
分表粒度不同的表,结果原本一次查询能完成的业务,可能需要多次查询才能完成。 - 粗略的解决方法:
- 全局表,基础数据,所有库都拷贝一份。
- 字段冗余:这样有些字段就不用
join
去查询了。 - 系统层组装:分别查询出所有,然后组装起来,较复杂。
分库分表方案产品
- 目前市面上的分库分表中间件相对较多,其中:
- 基于代理方式的有
MySQL Proxy
和Amoeba
, - 基于
Hibernate
框架的是Hibernate Shards
, - 基于
jdbc
的有当当sharding-jdbc
, - 基于
mybatis
的类似maven
插件式的有蘑菇街的蘑菇街TSharding
, - 通过重新
spring
的ibatis template
类的Cobar Client
。 - 还有一些大公司的开源产品:
- 基于代理方式的有