什么是分库分表?
与其说什么是分库分表不如说分库分表都包含哪些分法。
垂直分表
通过表字段拆分,将原来一个大表拆分为若干个小表(独立业务含义的表,或者**扩展表)。
通常我们在设计的时候就应该控制表字段的个数,而不能任由字段越来越多,再去垂直拆分表。
水平分表
通过分表(垂直、水平),直接减少了每张表的数据量。
-
减少锁冲突
-
可以使得行数据变小,一个数据块(Block)就能存放更多的数据,在查询时就会减少I/O次数(每次查询时读取的Block 就少)
-
可以达到最大化利用Cache的目的,具体在垂直拆分的时候可以将不常变的字段放一起,将经常改变的放一起
-
数据维护简单,便于扩展
通常我们会在水平分表的时候也做分库,因为垂直拆分后这些表还保存在同一个库中,所以库级别还是会有 IO 等瓶颈
单表进行切分后,是否要将切分后的多个表分散在不同的数据库服务…
垂直分库
垂直分库解决了数据业务层面的耦合,基于服务化的思想,便于后续扩张。同时也一定程度提升了单库的瓶颈限制。
水平分库
明显的解决了单库存在的瓶颈。
读写分离
- 主库,提供数据库写服务
- 从库,提供数据库读服务
- 主从之间,通过某种机制同步数据,比如mysql的binlog
典型适用于读多写少的场景,线性提升数据库读性能,并且通过消除读写锁冲突提升数据库写性能。但是也会带来主从数据不一致的问题!根据场景考虑要使用缓存还是读写分离方案。
分库分表不是做的越多越好,一定要根据实际的情况出发。特别是对一些数据量有限,发展有限的业务,分库分表做了后优势不明显,带来的麻烦却很明显,下文详述
怎么分?
分库分表本质是将数据尽可能平均的分散,以避免产生的性能瓶颈。(垂直拆分核心解决性能瓶颈的同时,也是一种分布式服务化业务数据的思想)。
平均分拆数据
分库分表需要考虑的核心设计目标是尽可能的保证数据平均拆分,以避免明显的热点数据访问、数据增长过快可能会出现的瓶颈。
待续