数据库分库分表的基本实践
分库分表其实就是把大的数据库中的数据拆分多个小数据库中存储,把大数据表中存储的数据拆分到多个小数据表中存储,让单一数据库或单一数据表中的数据量变小,降低数据库和数据表的查询时扫描的数据行数,提高操作效率。
分库分表的具体方式可以分为:
- 垂直分表
- 垂直分库
- 水平分表
- 水平分库
根据库或表的数据特点逐步递进的进行分库分表,缩小单表/库的数据量,例如先垂直分当不能再分时尝试水平分,如果某一种分法已经可以满足业务需求后就不需要再细分了。
垂直分表
找出数据表中频繁访问的字段和不频繁访问的字段,将不频繁访问的字段拆分到新的表中,使用相同主键关联起两表中的记录(拆分前的同一条记录)
示例:商品信息表的字段列表
商品编号 条码 规格 单位 名称 价格
其中 "商品编号" 是表主键,"规则" 和 "单位" 是商品信息表不频繁访问的字段。
原始表:商品编号 条码 规格 单位 名称 价格
↓
分表一:商品编号 条码 名称 价格
分表二:商品编号 规格 单位
经过拆分后,原始表的数据量减少,提升了数据访问的效率。
垂直分库
项目开始的初期,我们可能只有一个数据库,项目不同功能模块的数据可能都存储在同一个库中,随着功能模块的增多以及数据量的膨胀,我们可以给不同功能模块都分配一个数据库,然后把该功能模块相关的数据表都放在这个模块中。 示例:
graph TD
订单服务 --> 订单数据库
商品服务 --> 商品数据库
仓储服务 --> 仓储数据库
这样做的好处是:
- 降低单库的数据量。
- 降低单库的访问流量。
- 降低单库故障导致系统整体故障的风险。
水平分表
水平分表实际上是按照一定的规则把表中的数据拆分到多张表中,确保每张数据表中的数据量适中,不会对数据操作性能造成严重的影响。
示例:超市库存盘点明细表的字段列表
盘点单号 门店编号 仓库编号 商品编号 盘点数量 盈亏数量 操作员 盘点时间 验收员 验收日期
盘点明细的概念是超市等售卖系统对实际商品库存和系统显示库存的核对,判断系统和实际商品的库存数量差,如果是系统库存多于实际库存就是盘点亏损,如果少于则是盘点盈有,盈亏数量就是代表这里的库存差。
对于"盘点明细表" 我们可以拆分出一张"盘点明细历史"表,将有验收员和验收日期的数据存放到该表中,因为已验收的数据一般不会再进行增删改操作,只会进行查询操作。所以可以把活跃的数据继续留在"盘点明细表",不活跃的数据放在历史表。
对于历史表可再根据「验收时间」拆成一个月一张表格或根据「门店编号」一个门店拆出一张表格,这些都可以根据业务的具体情况具体分析设计。
水平拆分的重点还是:通过制定规则来确保每张数据表中的数据量适中,不会成为系统性能的瓶颈。
水平分库
水平分库其实和水平分表是类似的都是按一定的规则把一个库的数据分散存储到多个新库中,但是单个服务器数据库的数量多了,性能也会下降,那么我们也可以设置规则增加服务器的数量。
举个例子,我们可以把每 500 个用户的数据存储到一个新数据库中(同一个服务器),然后没到达 5000 个用户将增加一台新服务器,相当于每个服务器支撑 10 个数据库。