一、什么是分库分表
分库分表是数据库设计中的一种策略,用于将数据分散存储在多个数据库(分库)和多个表(分表)中,以提高数据库的可扩展性、性能和可用性。这种策略通常在数据量非常大、访问量非常高的情况下使用。
二、什么时候需要分库分表
网上查了好多资料,一个项目到底什么时候需要分库分表? 这个问题应该是没有标准的答案,但是可以从用户的角度回答这个问题,凡是通过数据库操作影响用户体验,甚至体验感很差时,都需要考虑优化数据库,进行分库分表。
行内不成文的标准:
单表记录行数超过500w条
单表存储空间超过2GB
……
三、分库分表的方式
垂直分库
垂直分库:以表为依据,根据业务将不同表拆分到不同库中。
特点:
每个库的表结构都不一样。
每个库的数据也不一样。
所有库的并集是全量数据。
优点:
业务清晰,便于维护:垂直分库通常按照业务模块来划分,使得每个数据库更加专注于特定的业务逻辑,便于管理和维护。
减少单个数据库的压力:通过将不同的业务模块分配到不同的数据库中,可以减少单个数据库的访问压力,提高系统的性能。
提高系统的可扩展性:垂直分库可以使系统更容易进行扩展,当某个业务模块的数据量增加时,可以通过增加相应的数据库来进行扩展。
支持数据量增长时的横向扩展:通过增加数据库或表的数量来提高系统容量。
高可用性:通过分库分表来分散数据,避免单点故障,增强容错能力。
缺点:
数据关联复杂:由于数据被分布到不同的数据库中,跨库查询和事务处理变得更加复杂,可能需要引入分布式事务管理器。
运维成本增加:需要管理多个数据库,运维成本相对较高。
部分业务表无法Join:只能通过接口方式解决,提高了系统的复杂度。
受每种业务的不同限制:存在单库性能瓶颈,不易进行数据扩展和提升性能。
事务处理复杂:跨库事务难度加大,可能需要引入分布式事务解决方案,如使用两阶段提交协议等。
管理复杂:分库分表会增加数据库管理和维护的复杂性,数据一致性、跨库查询、事务管理等问题需要额外关注。 垂直分库适用于业务模块间耦合度较低、数据量分布不均的场景,可以有效地提升性能和可扩展性,但同时也带来了数据管理和跨库操作的复杂性。
垂直分表
将一个表按照字段的业务相关性拆分成多个小表,每个小表存储部分字段的数据。
特点:
每个表的结构都不一样。
每个表的数据也不一样,一般通过一列(主键/外键)关联。
所有表的并集是全量数据。
原理:
一个表中的字段可能具有不同的访问频率和性能需求,通过垂直分表可以将不常访问的字段分离出来,减少单个表的数据量和索引大小,提高查询性能。例如,将用户表中的基本信息字段和详细信息字段分别存储在两个不同的表中。
优点:可以提高查询性能,减少数据冗余。
缺点:表的关联查询变得复杂,需要使用多表连接或者多次查询。
水平分库
将一个数据库中的数据按照一定的规则分散存储到多个不同的数据库中。
特点:
每个库的表结构都一样。
每个库的数据都不一样。
所有库的并集是全量数据。
原理:根据数据的某个特征(如用户 ID、订单 ID 等)进行哈希运算或者取模运算,将数据均匀地分布到多个数据库中。例如,根据用户 ID 进行取模运算,将用户数据分散存储到 10 个数据库中。
优点:可以提高数据库的可扩展性和性能,当数据量增加时,可以方便地添加新的数据库。
缺点:跨库查询和事务处理比较复杂,需要使用分布式查询和事务解决方案。
水平分表
以字段为依据,将一个表中的数据按照一定的规则分散存储到多个相同结构的表中。
特点:
每个表的表结构都一样。
每个表的数据都不一样。
所有表的并集是全量数据。
原理:与水平分库类似,根据数据的某个特征进行哈希运算或者取模运算,将数据均匀地分布到多个表中。
例如,根据订单创建时间进行分表,将每天的订单数据存储在一个单独的表中。
优点:可以提高表的查询和写入性能,当表的数据量增加时,可以方便地添加新的表。
缺点:表的管理变得复杂,需要使用中间件或者代码来实现数据的路由和合并。
随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:
IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。 请求数据太多,带宽
不够,网络IO瓶颈。
CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。
为了解决上述问题,我们需要对数据库进行分库分表处理。
分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。