数据库拆分原则:

1.优先考虑缓存降低对数据库的读操作。

2.再考虑读写分离,降低数据库写操作。

3.最后开始数据拆分,切分模式: 首先垂直(纵向)拆分、再次水平拆分。

4.首先考虑按照业务垂直拆分。

5.再考虑水平拆分:先分库(设置数据路由规则,把数据分配到不同的库中)

6.最后再考虑分表,单表拆分到数据1000万以内。

 

拆分原则:

1.尽量不拆分 ,架构师进化而来,不是一蹴而就。(SOA)

2.最大可能的找到合适的切分维度。

3.由于数据库中间件对数据join实现的优劣难以把握,而且实现高性能难度极大,

 业务读取尽量少使用多表的Join-尽量通过数据冗余,分组避免数据跨库多表Join。

4.尽量避免分布式事物。

5.单表拆分到数据1000万以内。

背景-缘由:

当数据库的数据量非常大时,水平拆分和垂直拆分是两种常见的降低数据库大小,提升性能的方法。

垂直拆分:列的拆分

专库专用:一个数据库由很多表的构成,每个表对应不同的业务,垂直拆分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面;

特点:

将一个属性较多,一行数据较大的表,将不同的属性拆分到不同的表中。

(1)每个库(表)的结构都不一样

(2)一般来说。每个库(表)的属性至少有一列交集,一般是主键

(3)所有库(表)的并集是全量数据

优点:

1.拆分后业务清晰,拆分规则明确。

2.系统之间整合或者扩展容易。

3.数据维护简单。

缺点:

1.部分业务表无法join。只能通过接口方式解决,提高了系统复杂度。

2.受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。

3.事务处理复杂。

 

垂直拆分的依据: (当一个表属性很多)

(1)长度较短,访问频率较高的属性尽量放到一个表里,这个表暂且成为主表。---优先考虑

(2)将字段较长,访问频率较低的属性尽量放在一张表里,这个表暂且成为扩展表。---优先考虑

(3)经常一起访问的属性也放到一张表里面。--如果1和2都满足,可以考虑第三点,非必须

为什么这样拆分的原因:

为何要将字段短,访问频率高的属性放在一个表内?为什么这么垂直拆分可以提升性能?因为:

(1)数据库有自己的内存缓存buffer,会将磁盘上的数据下载load到内存缓存buffer里(暂且理解为进程内缓存吧)

(2)内存buffer缓存数据是以行row为单位的。

(3)在内存有限的情况下,在数据库内存buffer里缓存短长度的数据行row,就能缓存更多的数据。

(4)在数据内存buffer里缓存访问频率高的row,就能提升缓存命中率,减少磁盘的访问。

 

注意点:

服务层访问数据库的主表和副表属性时,服务层不要使用Join来连表访问,而应该分两次进行查询

原因:大数据高并发互联网场景下,一般来说。吞吐量和扩展性是主要矛盾

(1)join更消耗数据库性能

(2)join会让主表和扩展表耦合在一起(必须在一个数据库实例上),不利于数据量大时拆分到不同的数据库实例上(机器上),毕竟减少数据量,提升性能才是垂直拆分的初衷。

 

水平拆分:行的拆分

垂直拆分后遇到单机瓶颈,相对于垂直拆分的区别是:

垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一张表拆到不同的数据库中

我们可以将数据的水平切分理解为我们将数据的水平切分理解为按照数据行的切分,

就是讲表中的某些行切分到一个数据库,而另外的某些行后切分到其他的数据库中,主要有分表,分库两种模式;

特点:

某个字段为依据(例如uid),按照一定规则(例如取模),将一个库(表)上的数据拆分到多个库(表)上。

(1)每个库(表)的结构都一样

(2)每个库(表)的数据都不一样,没有交集

(3)所有库(表)的并集全量数据

 

优点:

1.不存在单库大数据,高并发的性能瓶颈;

2.对应用透明,应用端改造较少。

3.按照合理拆分规则拆分,join操作基本避免跨库。

4.提高了系统的稳定性跟负载能力。

缺点:

1.拆分规则难以抽象。

2.分片事务一致性难以解决。

3.数据多次扩展难度跟维护量极大。

4.跨库join性能较差。

 

拆分的处理难点:

两种方式的共同缺点:

1.引入分布式事物的问题。

2.跨节点join的问题。

3.跨节点合并排序分页问题。

 

针对数据源管理,目前主要有两种思路:

A:客户端模式,在每个应用程序模块中配置管理自己需要的一个(或者多个)数据源,

直接访问各个数据库,在模块内完成数据的整合。

优点:相对简单,无性能损耗。

缺点:不够通用,数据库连接的处理复杂,对业务不够透明,处理复杂。

B:通过中间代理层来统一管理所有的数据源,后端数据库集群对前端应用程序透明;

优点:通用,对应用透明,改造少。

缺点::实现难度大,有二次转发性能损失:

拆分原则:

1.尽量不拆分 ,架构师进化而来,不是一蹴而就。(SOA)

2.最大可能的找到合适的切分维度

3.由于数据库中间件对数据join实现的优劣难以把握,而且实现高性能难度极大,

 业务读取尽量少使用多表的Join-尽量通过数据冗余,分组避免数据跨库多表Join。

4.尽量避免分布式事物

5.单表拆分到数据1000万以内

 

切分方案

范围,枚举,时间,取模,哈希,制定等。