数据库分库分表
当系统业数据量骤增,数据库无力支撑大量数据的查询操作,数据库将变成系统瓶颈。此时可以考虑分表分库。
假设目前系统数据库为单实例架构,如下所示。
垂直操作
垂直分表
垂直分表的概念比较简单。假设我们把商品信息存在一张表中,商品信息包括基本信息和描述,用户浏览商品时一般先浏览商品的基本信息(轻数据),然后点击详情浏览描述信息(重数据)。将所有数放入一张表查询时大量的IO操作严重影响数据库性能。所以可做如下拆分。
商品基本信息和描述信息分表查询以减少IO压力。
垂直分库
垂直分库是指将数据库按照业务归类,专表专库。如用户表放入用户库,商品表放入商品库,订单表放入订单库,各个业务线的操作互不干扰。
水平操作
其实如上的分隔任然没法解决海量数据带来的性能下降,因为单表数据量依然很大。此时可以采用水平切分。
水平分库
水平分库是指将数据按照一定规则,存储到不同数据库中。如下,将商品数据按照商品ID的奇偶性存放至两个不同的数据库中。切分完的两个数据库接口完全一致。
此时的数据库架构可以调整为如下
如果水平分库之后单表的数据量依然巨大,可以进一步水平分表,将商品数据库中 的每个表水平的切分为多张表(按照某种规则)
此时的数据库单表数据较为分散。数据库架构调整为如下。
后记:分库分表会增加系统的复杂度,在项目的设计阶段就应该做好规划对设计库有一个合理稳定的设计。如:在设计阶段就应该考虑垂直分表分库。根据业务结构讲数据库分为用户库、商品库、订单库等等;提早的将商品信息表分为商品基本信息表和商品描述表,类似这种设计应该在项目设计阶段完成,若是在中途修改无疑会给项目开发带来巨大隐患。又或根据预估的数据量结合数据库的承受能力进行水平分表分库。如系统中要存储用户每天的行为记录,这些数据必然是海量的,此时就应该想到提前分表分库;再如系统在发展的某个阶段用户数据量剧增,而开始阶段并没有对用户表/库水平切分,此时在考虑按照一定规则水平切分。
分库分表不是目的,不到不得已,不进行分表分库。项目中数据库层面遇到瓶颈应该先想着怎么去优化项目,比如添加缓存,优化查询等。
本文来自博客园,作者:iyandongsheng,转载请注明原文链接:https://www.cnblogs.com/ieas/articles/15736225.html