什么是分库分表?分库分表有哪些类型(或策略)?

Sherwin.Wei Lv7

什么是分库分表?分库分表有哪些类型(或策略)?

回答重点

分库分表是数据库性能优化的一种方法,通过将数据分散存储在多个数据库或表中,来提高系统的可扩展性、性能和可用性。

分库分表的类型(或策略) 包括:

1)水平分表

  • 将同一张表的数据按行划分,分散到多个表中。例如,可以按用户 ID 的范围将数据分为多个表(如 user_1user_2)。

2)垂直分表

  • 将一张表的不同列拆分到多个表中,以减少每张表的字段数量和提高查询效率。例如,用户表可以分为基本信息表和详细信息表。

3)水平分库

  • 将相同的表结构复制一份到另一个库中,每个库的表结构是一样的,可以减少单一数据库的读写压力,在大数量的情况下提高读写性能。例如,database1database2

4)垂直分库

  • 将数据分散到不同的数据库实例中。可以根据业务功能或模块进行分库,如将用户数据、订单数据分别存储在不同的数据库中。

扩展知识

为什么需要分库分表

随着用户量的激增和时间的堆砌,存在数据库里面的数据越来越多,此时的数据库就会产生瓶颈,出现资源报警、查询慢等场景。

首先单机数据库所能承载的连接数、I/O及网络的吞吐等都是有限的,所以当并发量上来了之后,数据库就渐渐顶不住了。

660.png

再则,如果单表的数据量过大,查询的性能也会下降。因为数据越多 B+ 树就越高,树越高则查询 I/O 的次数就越多,那么性能也就越差。

因为上述的原因,不得已就得上分库分表了。

把以前存在一个数据库实例里的数据拆分成多个数据库实例,部署在不同的服务器中,这是分库。

把以前存在一张表里面的数据拆分成多张表,这是分表。

一般而言:

  • 分表:是为了解决由于单张表数据量多大,而导致查询慢的问题。大致三、四千万行数据就得拆分,不过具体还是得看每一行的数据量大小,有些字段都很小的可能支持更多行数,有些字段大的可能一千万就顶不住了。
  • 分库:是为了解决服务器资源受单机限制,顶不住高并发访问的问题,把请求分配到多台服务器上,降低服务器压力。

分库分表的优点

  • 提高性能:分库后,通过减少单个数据库的负载,提高读写性能。
  • 可扩展性:可以通过增加新的数据库或表来扩展系统。
  • 容错性:某个库或表的故障不会影响整个系统。

分库分表的缺点

  • 复杂性:数据的查询、维护和事务管理变得复杂,增加了开发和运维的成本。
  • 事务处理:跨库或跨表的事务处理复杂,需要额外的处理机制。
  • 数据一致性:需要额外机制来保证数据的一致性和完整性。

分库图示

一般分库都是按照业务划分的,比如订单库、用户库等等。

有时候会针对一些特殊的库再作切分,比如一些活动相关的库都做了拆分。

因为做活动的时候并发可能会比较高,怕影响现有的核心业务,所以即使有关联,也会单独做拆分。

670.png

分表图示

分表其实有两种:

  • 垂直分表
  • 水平分表

垂直分表,来看个图,很直观:

690.png

垂直分表就是把一些不常用的大字段剥离出去。

像上面的例子:用户名是很常见的搜索结果,性别和年龄占用的空间又不大,而地址和个人简介占用的空间相对而言就较大,我们都知道一个数据页的空间是有限的,把一些无用的数据拆分出去,一页就能存放更多行的数据。

内存存放更多有用的数据,就减少了磁盘的访问次数,性能就得到提升。

水平分表,则是因为一张表内的数据太多了,我们知道数据越多 B+ 树就越高,访问的性能就差,所以进行水平拆分。

700.png

其实不管这些,浅显的理解下,在一百个数据里面找一个数据快,还是在一万个数据里面找一个数据快?

即使有索引,那厚的书目录多,翻目录也慢~

Comments