数据库分库分表

当系统业数据量骤增,数据库无力支撑大量数据的查询操作,数据库将变成系统瓶颈。此时可以考虑分表分库。

假设目前系统数据库为单实例架构,如下所示。

image

垂直操作

垂直分表

垂直分表的概念比较简单。假设我们把商品信息存在一张表中,商品信息包括基本信息和描述,用户浏览商品时一般先浏览商品的基本信息(轻数据),然后点击详情浏览描述信息(重数据)。将所有数放入一张表查询时大量的IO操作严重影响数据库性能。所以可做如下拆分。

image

商品基本信息和描述信息分表查询以减少IO压力。

垂直分库

垂直分库是指将数据库按照业务归类,专表专库。如用户表放入用户库,商品表放入商品库,订单表放入订单库,各个业务线的操作互不干扰。

image

水平操作

其实如上的分隔任然没法解决海量数据带来的性能下降,因为单表数据量依然很大。此时可以采用水平切分。

水平分库

水平分库是指将数据按照一定规则,存储到不同数据库中。如下,将商品数据按照商品ID的奇偶性存放至两个不同的数据库中。切分完的两个数据库接口完全一致。

image

此时的数据库架构可以调整为如下

image

如果水平分库之后单表的数据量依然巨大,可以进一步水平分表,将商品数据库中 的每个表水平的切分为多张表(按照某种规则)

image

此时的数据库单表数据较为分散。数据库架构调整为如下。

image


后记:分库分表会增加系统的复杂度,在项目的设计阶段就应该做好规划对设计库有一个合理稳定的设计。如:在设计阶段就应该考虑垂直分表分库。根据业务结构讲数据库分为用户库、商品库、订单库等等;提早的将商品信息表分为商品基本信息表和商品描述表,类似这种设计应该在项目设计阶段完成,若是在中途修改无疑会给项目开发带来巨大隐患。又或根据预估的数据量结合数据库的承受能力进行水平分表分库。如系统中要存储用户每天的行为记录,这些数据必然是海量的,此时就应该想到提前分表分库;再如系统在发展的某个阶段用户数据量剧增,而开始阶段并没有对用户表/库水平切分,此时在考虑按照一定规则水平切分。

分库分表不是目的,不到不得已,不进行分表分库。项目中数据库层面遇到瓶颈应该先想着怎么去优化项目,比如添加缓存,优化查询等。

posted @ 2022-09-09 11:26  iyandongsheng  阅读(129)  评论(0编辑  收藏  举报