1、垂直切分
(1)按照功能模块进行切分
例如:一个购物网站有以下常见的功能模块:订单、购物车、查询、支付。
(2)按照表进行拆分
一个表中某些列很常用,另外一些不常用,则可以进行垂直分割,把主码和一些列放到一个表,然后把主码和另外的列放到另外一个表。
这样做的好处在于:数据行数会变小,一个数据页就能存放更多的数据,在查询时,会减少IO次数。
缺点在于:需要管理冗余列,查询所以数据需要join操作。
垂直切分优缺点:
优点:
(1)数据库拆分简单明了,拆分规则明确。
(2)应用程序模块清晰明确,整合容易。
(3)数据维护方便易行,容易定位。
缺点:
(1)部分表关联无法在数据库级别完成,需要在程序中完成。
(2)对于访问极其频繁并且数据量超级大的表仍然存在性能瓶颈,不一定能满足要求。
(3)事务处理相对更为复杂。
(4)切分达到一定程度之后,扩展性(维护性)会遇到限制。
(5)过多切分可能带来系统过度复杂而难以维护。
2、水平切分
单表数据量过大,访问速度过慢,维护比较麻烦,需要对表进行拆分。
常规拆分规则:
按照实际用的字段进行拆分。
(1)按照范围进行拆分,orderid:1-10000,10001-20000......
(2)按照订单创建时间进行拆分,createdate
(3)按照orderid取模,orderid%N
(4)按照枚举值进行拆分,areacode
水平切分的优缺点:
优点:
(1)表关联基本能在数据库端全部完成。
(2)不存在某些超大型数据量和高负载的表遇到瓶颈的问题。
(3)应用程序端整体架构改动相对较少。
(4)事务处理相对简单。
(5)只要切分规则能够定义好,基本上较难遇到扩展性限制。
缺点:
(1)切分规则相对较为复杂,很难抽象出一个能够满足整个数据库的切分规则。
(2)后期数据的维护难度有所增加,人为手工定位数据更困难。
(3)应用系统各模块耦合度较高,可能会对后面数据的迁移拆分造成一定的困难。
3、联合切分
联合切分的优点:
(1)可以充分利用垂直切分和水平切分各自的优势而避免各自的缺陷。
(2)让系统扩展性得到最大化提升。
联合切分的缺点:
(1)数据库系统架构比较复杂,维护难度更大。
(2)应用程序架构也相对更复杂。
4、解决思路
总的来说存在两种解决思路:
(1)在每个应用程序木块中配置管理自己需要的一个(或多个)数据源,直接访问各个数据库,在模块内完成数据的整合。
(2)通过中间代理层来统一管理所有的数据源,后端数据库集群对前端应用程序透明。
5、数据库中间件
常见的数据库中间件:
TDDL处于停滞状态
Amoeba处于停滞状态
Cobar处于停滞状态
MyCAT社区非常活跃
MyCAT又是在Cobar基础上发展的版本,两个显著点是:后端由BIO(同步阻塞IO)改为NIO(同步非阻塞IO),并发量有大幅提高增加了对order by、group by、limit等聚合功能的支持(虽然Cobar也可以支持order by、group by、limit语法,但是结果没有进行聚合,只是简单返回给前端,聚合功能还是需要业务系统自己完成)。