什么是分库分表
分库:就是一个数据库分成多个数据库。
分表:就是一个数据表分成多个数据表。
谜底就在谜面上
为什么要分库分表
随着业务量的迅猛增长,数据库可能会面临性能瓶颈的挑战,尤其是在处理庞大的数据集,例如千万级别的数据量时,SQL查询的效率会明显降低。
此外,数据量的扩张同样会对数据库的整体性能产生影响,例如,单个数据库的容量过大可能会引发存储和I/O问题,而表结构中字段数量的增加也可能导致效率下降。
为应对这些问题,实施分库分表策略是一种有效的解决方案。
如何分库
分库原理:将数据分布在不同的数据库中。每个数据库可以部署在不同的服务器上,也可以部署在同一服务器上,其目的在于分散和减轻单一数据库的运行压力。具体可分为垂直分库,水平分库两种。
什么是垂直分库
垂直分库指根据业务模块划分,将不同的表(业务模块)分布在不同的数据库,此时不同的数据库的数据表不相同。
如有以下原始主数据库,未分库前所有表都在一个数据库中,大体结构如下。
原始主数据库(未分库) |
---|
用户表 user |
订单表 order |
商品表 goods |
其它业务表 ...... |
现根据业务,将表单独分离出来成为独立的数据库,大体结构如下。
用户数据库 | 订单数据库 | 商品数据库 | 原始主数据库 |
---|---|---|---|
用户表 user | 订单表 order | 商品表 goods | 其它业务表 ...... |
通过上述垂直分库的方式,将原始主数据库按业务分割成了4个数据库,每个数据库做为单独的业务数据。
什么是水平分库
水平分库指根据数据行的范围划分,将相同数据库的表数据(数据行)分布在不同的数据库,此时不同的数据库表可以相同,也可以不同。
如有以下原始主数据库,未分库前所有表都在一个数据库中,大体结构如下。
原始主数据库(未分库) |
---|
用户表 user |
订单表 order |
商品表 goods |
其它业务表 ...... |
现根据表数据(数据行),将原始数据库 按时间划分(此为示例,亦可按其它方式) 成不同的数据库,大体结构如下。
主数据库(库中表存的数据为当年数据,或主要不便分割的数据表) |
---|
用户表 user |
订单表 order |
商品表 goods |
其它业务表 ......(可分库或不分库) |
数据库2023(库中表存的数据为2023年的数据) |
---|
用户表 user |
订单表 order |
商品表 goods |
其它业务表 ......(可根据业务情况分库) |
数据库2022(库中表存的数据为2022年的数据) |
---|
用户表 user |
订单表 order |
商品表 goods |
|
通过上述水平分库的方式,将原始主数据库按表数据(数据行)分割成了2个数据库,每个数据库保存不同时间的业务数据。
示例中表结构一致,但分库也可以做到不一致,比如其它业务表,如果数据不大或不便于分割,可以保存在某个数据库中,做为主库的数据表
如何分表
分表原理:将数据从一个大表中分散到多个结构相同或不同的小表中。这些小表可以分布在同一个数据库或不同数据库中。具体可分为垂直分表,水平分表两种。
什么是垂直分表
垂直分表指将存在一张表中的字段切分到多张表,每张表的数据字段不同,多张表字段组合起来即为原始表的字段。
如有以下原始表,未垂直分表前字段结构及表数据如下。
商品表 goods | ||
---|---|---|
gid(主键ID) | title(标题) | content(内容) |
1 | 某某某某商品 | 保存大量富文本用于显示内容 |
2 | 某某某某商品 | 保存大量富文本用于显示内容 |
由于内容字段在大多数据时间下不参与业务处理,并且存储的大量富文本导致数据量大,当表数据庞大时会影响查询效率,此时进行垂直分表,将内容字段单独分离。分表后字段结构及表数据如下。
商品表 goods | |
---|---|
gid(主键ID) | title(标题) |
1 | 某某某某商品 |
2 | 某某某某商品 |
商品内容表 goods_info | ||
---|---|---|
infoid(主键ID) | gid(商品ID) | content(内容) |
1 | 1 | 保存大量富文本用于显示内容 |
2 | 2 | 保存大量富文本用于显示内容 |
通过分表操作后,商品表被拆分为两张表,主表结构得到了简化,查询效率将会提高。
什么是水平分表
水平分表指的表结构不变,将单表数据切分成多表。每张表的数据不同,所有表的数据的总合为原始表数据。
如有以下原始表,未水平分表前字段结构及表数据如下。
商品表 goods | ||
---|---|---|
gid(主键ID) | title(标题) | content(内容) |
1 | 某某某某商品 | 保存大量富文本用于显示内容 |
2 | 某某某某商品 | 保存大量富文本用于显示内容 |
现根据表数据(数据行),将原始数据表 按时间划分(此为示例,亦可按其它方式) 成不同的数据表,分表后字段结构及表数据如下。
商品2024表 goods_2024 | (存储2024年的数据) | |
---|---|---|
gid(主键ID) | title(标题) | content(内容) |
1 | 某某某某商品 | 保存大量富文本用于显示内容 |
2 | 某某某某商品 | 保存大量富文本用于显示内容 |
商品2023表 goods_2023 | (存储2023年的数据) | |
---|---|---|
gid(主键ID) | title(标题) | content(内容) |
1 | 某某某某商品 | 保存大量富文本用于显示内容 |
2 | 某某某某商品 | 保存大量富文本用于显示内容 |
通过分表操作后,商品表被拆分为两张表,每张表的数据字段结构相同,但数据量降低,查询效率将会提高。
注意事项
在单库单表模式下,通常使用表自增主键ID保证全局唯一性,当分库分表后,则不能再使用自增主键ID做为唯一性,因为ID可能出现重复的情况。
此时需要自行维护全局唯一ID,如使用UUID、雪花算法等。
总结
分库分表是在数据库系统架构设计中常用的一种方法,其核心目的是解决由于单一数据库或表中数据量激增而导致的性能瓶颈、可管理性下降及扩展性问题。该方法能够有效提升数据库系统的处理能力及查询效率。