1、什么是分库分表
1.1、分表
将同一个库中的一张表(比如SPU表)按某种方式(垂直拆分、水平拆分)拆分成SPU1、SPU2、SPU3、SPU4…等若干张表,如下图所示:
1.2、分库
在表数据不变的情况下,对数据库进行拆分,即将一个库中的若干张表按某种方式拆分出来,放到不同的数据中,如下图所示:
1.3、分库+分表
数据库的数量和表的数量都有变化,例如将一个数据库中的一张表(比如SPU表)拆分成SPU1、SPU2、SPU3、SPU4…等若干张表,并放到不同的数据里面,如下图所示:
2、拆分方式
2.1、水平拆分
水平拆分指的是在整个表数据结构不发生变化的前提下,我们将一张表的数据拆分成多张表,如下图所示:
这样拆分完以后,单张表的数据量就降下来了,读写性能自然就上去了。
2.2、垂直拆分
垂直拆分指将本来放在一张表中的字段,按业务需求拆分开放到多张表中,如下图所示:
这样拆分完后,就将需要经常查询的数据单独放到一张表中了,性能也就提上去了。
2、何时进行分库分表?
当系统性能出现瓶颈,我们通过代码优化、加缓存、JVM性能调优、限流、搭建集群等常用的技术手段依然无法很好的解决问题时,就可以考虑采用分库分表来提高系统的性能。常见需要进行分表分表的场景有以下几点:
2.1、单表出现性能瓶颈
单表数据量较大,导致读写性能较慢。
2.2、单库出现性能瓶颈
- CPU压力过大(busy、load过高),导致读写性能较慢。
- 内存不足(缓存池命中率较低、磁盘读写IOPS过高),导致读写性能较慢。
- 磁盘空间不足,导致无法正常写入数据。
- 网络带宽不足,导致读写性能较慢。
3、如何选择分库、分表或者分库+分表
3.1、只分表
- 单表数据量较大,单表读写性能出现瓶颈。
- 经过评估单库的容量和性能可以支撑未来几年的数据量增长。
3.2、只分库
- 数据库(读)写压力较大,数据库出现存储性能瓶颈。
3.3、分库分表
- 单表数据量较大,单表读写性能出现瓶颈。
- 数据库(读)写压力较大,数据库出现存储性能瓶颈。
4、分库分表带来的问题
4.1、分布式唯一ID
分库分表后,一张表被拆成了多张表,数据库的自增ID无法保证数据的唯一性了,因此需要映入一种方案来保证数据ID的唯一性。成熟的解决方案有以下几个: