什么是分库分表?分库分表有哪些类型(或策略)?
什么是分库分表?分库分表有哪些类型(或策略)?
回答重点
分库分表是数据库性能优化的一种方法,通过将数据分散存储在多个数据库或表中,来提高系统的可扩展性、性能和可用性。
分库分表的类型(或策略) 包括:
1)水平分表:
- 将同一张表的数据按行划分,分散到多个表中。例如,可以按用户 ID 的范围将数据分为多个表(如
user_1、user_2)。
2)垂直分表:
- 将一张表的不同列拆分到多个表中,以减少每张表的字段数量和提高查询效率。例如,用户表可以分为基本信息表和详细信息表。
3)水平分库:
- 将相同的表结构复制一份到另一个库中,每个库的表结构是一样的,可以减少单一数据库的读写压力,在大数量的情况下提高读写性能。例如,
database1、database2。
4)垂直分库:
- 将数据分散到不同的数据库实例中。可以根据业务功能或模块进行分库,如将用户数据、订单数据分别存储在不同的数据库中。
扩展知识
为什么需要分库分表
随着用户量的激增和时间的堆砌,存在数据库里面的数据越来越多,此时的数据库就会产生瓶颈,出现资源报警、查询慢等场景。
首先单机数据库所能承载的连接数、I/O及网络的吞吐等都是有限的,所以当并发量上来了之后,数据库就渐渐顶不住了。

再则,如果单表的数据量过大,查询的性能也会下降。因为数据越多 B+ 树就越高,树越高则查询 I/O 的次数就越多,那么性能也就越差。
因为上述的原因,不得已就得上分库分表了。
把以前存在一个数据库实例里的数据拆分成多个数据库实例,部署在不同的服务器中,这是分库。
把以前存在一张表里面的数据拆分成多张表,这是分表。
一般而言:
- 分表:是为了解决由于单张表数据量多大,而导致查询慢的问题。大致三、四千万行数据就得拆分,不过具体还是得看每一行的数据量大小,有些字段都很小的可能支持更多行数,有些字段大的可能一千万就顶不住了。
- 分库:是为了解决服务器资源受单机限制,顶不住高并发访问的问题,把请求分配到多台服务器上,降低服务器压力。
分库分表的优点
- 提高性能:分库后,通过减少单个数据库的负载,提高读写性能。
- 可扩展性:可以通过增加新的数据库或表来扩展系统。
- 容错性:某个库或表的故障不会影响整个系统。
分库分表的缺点
- 复杂性:数据的查询、维护和事务管理变得复杂,增加了开发和运维的成本。
- 事务处理:跨库或跨表的事务处理复杂,需要额外的处理机制。
- 数据一致性:需要额外机制来保证数据的一致性和完整性。
分库图示
一般分库都是按照业务划分的,比如订单库、用户库等等。
有时候会针对一些特殊的库再作切分,比如一些活动相关的库都做了拆分。
因为做活动的时候并发可能会比较高,怕影响现有的核心业务,所以即使有关联,也会单独做拆分。
分表图示
分表其实有两种:
- 垂直分表
- 水平分表
垂直分表,来看个图,很直观:
垂直分表就是把一些不常用的大字段剥离出去。
像上面的例子:用户名是很常见的搜索结果,性别和年龄占用的空间又不大,而地址和个人简介占用的空间相对而言就较大,我们都知道一个数据页的空间是有限的,把一些无用的数据拆分出去,一页就能存放更多行的数据。
内存存放更多有用的数据,就减少了磁盘的访问次数,性能就得到提升。
水平分表,则是因为一张表内的数据太多了,我们知道数据越多 B+ 树就越高,访问的性能就差,所以进行水平拆分。
其实不管这些,浅显的理解下,在一百个数据里面找一个数据快,还是在一万个数据里面找一个数据快?
即使有索引,那厚的书目录多,翻目录也慢~