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万以内。
切分方案
范围,枚举,时间,取模,哈希,制定等。