目录
1、分库分表的方式
1.1 垂直分表
1.1.1 定义
垂直分表的定义:将一个表按照字段分成多个表,每个表存储其中一部分的字段
1.1.2 作用
-
为了避免争抢IO资源并且减少了锁表的机率,避免争抢IO是因为减少了大字段的检索,避免锁表则是操作中对热门数据的操作过多争抢资源会进行锁表等待
-
充分的发挥了热门数据的操作效率,提高热门数据的效率是因为数据的访问量不一致,冷门数据不经常查询所以很少需要一次性查询所以的数据
1.1.3 垂直分表原则
-
把不常用的字段放在一张表
-
把text,blob等大字段拆分出来放在附表中
-
经常查询的数据放在一张表中
1.2 水平分表
1.2.1 定义
在同一个数据库内,把同一个表的数据按照一定的规则拆分到多个数据结构相同的表中,可以通过取余或者按照时间年月来进行水平分表
1.2.2 作用
-
优化单一表数据量过大而产生的性能问题
-
避免IO争抢并减少锁的机率
1.2.3 水平分表原则
-
水平分表目的就是为了解决单表数据量大的问题,所以我们可以通过按照时间年月或者订单ID取余数等这种方式把数据分布到同样数据结构的表中
1.3 垂直分库
1.3.1 定义
按照业务将表进行分类,分布到不同的数据库上面,每个库可以存放在不同的服务器上来避免对CPU或者内存等资源的争抢。
1.3.2 作用
-
避免对同一个物理机的CPU、内存、网络IO和磁盘的资源争抢
-
分布式系统开发的时候进行专库专用,对业务进行了解耦,业务更加清晰
1.3.3 垂直分库原则
-
按照具体的业务进行分类,将相关业务的表分配到一个数据库中
1.4 水平分库
1.4.1 定义:
水平分库就是把同一个表的数据按照一定规则拆分到不同的数据库中,每个库可以存放在不同的服务器上
1.4.2 作用:
-
解决单库数据量大的问题,提高了查询的性能
-
减少了IO的争抢和锁表的机率,提高系统的稳定性
1.4.3 水平分库原则
-
根据业务进行水平分库,可以取余获取按年、按月等
-
当一个应用难以再以垂直拆分的时候或拆分后数据量巨大存在单库读写、存储瓶颈的时候考虑进行水平分库
2、分库分表总结
垂直分表:可以把一个宽表的字段按访问频次、是否是大字段的原则拆分为多个表,这样既能使业务清晰,还能提升部分性能。拆分后,尽量从业务角度避免联查,否则性能方面将得不偿失。
垂直分库:可以把多个表按业务耦合松紧归类*,分别存放在不同的库,这些库可以分布在不同服务器,从而使访问压力被多服务器负载,大大提升性能,同时能提高整体架构的业务清晰度,不同的业务库可根据自身情况定制优化方案。但是它需要解决跨库带来的所有复杂问题。
水平分库:可以把一个表的数据(按数据行)分到多个不同的库,每个库只有这个表的部分数据,这些库可以分布在不同服务器,从而使访问压力被多服务器负载,大大提升性能。它不仅需要解决跨库带来的所有复杂问题,还要解决数据路由的问题(数据路由问题后边介绍)。
水平分表:可以把一个表的数据(按数据行)分到多个同一个数据库的多张表中,每个表只有这个表的部分数据,这样做能小幅提升性能,它仅仅作为水平分库的一个补充优化。
一般来说,在系统设计阶段就应该根据业务耦合松紧来确定垂直分库,垂直分表方案,在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大,且持续增长,再考虑水平分库水平分表方案。
欢迎关注我的微信公众号,更多内容将在微信公众号中发布: