access 分表存储_sharding:谁都能读懂的分库、分表、分区

本文通过实例详细讲解了数据库的分库、分表及分区策略,包括业务分库、垂直切分、水平切分(按字段条件、范围、取模)以及数据库分区。讨论了不同切分方式对性能的影响,同时指出分库分表带来的复杂性和问题,如跨节点join、扩容和数据迁移的挑战。
摘要由CSDN通过智能技术生成

本文通过大量图片来分析和描述分库、分表以及数据库分区是怎样进行的。

1.sharding前的初始数据分布

在本文中,我打算用高考考生相关信息作为实验数据。请无视表的字段是否符合现实,也请无视表的设计是否符合范式。

3张表:

考生表,存放全国所有高考考生信息,假设34个省、(直辖)市、(自治区、特别行政)区共3000W考生

学科表,分文理科,共9门课程(语文、数学、英语、历史、地理、政治、物理、化学、生物)

成绩表,存过全国所有考生所有学科成绩,每个学生6门成绩,共1.8亿条成绩数据

三张表放在名为"gaokao_db"的库中。所以,它们的结构如下:

这三张表的大致存储方式如下:

这个时候数据存储方式是单库多表。

2.业务分库

业务分库:按业务将不同表放进不同库。每个库可以放在不同数据库服务器上。

例如,在这里将原始数据库gaokao_db中的3个表分开放进两个数据库中,stu_db存放考生表,score_db存放成绩表。

还有一张学科表放在哪呢?对于那些很小、无需进行切片的表,可以将多个这样的表共同放在同一个库中,也可以根据联接特性将其分开放置在常与之进行联接的库中。在此处,学科表很小,没必要单独占用一个库甚至数据库服务器,且由于学科表只会和成绩表进行联接,所以将其放在score_db库中。

业务分库如下图:

stu_db和score_db可以放在同一数据库服务器上,也可以放在不同数据库服务器上,从而在整体上减轻系统的压力。但是,如果这两个库放在不同服务器上,因为跨数据库实例,将没法对stu_db和score_db中的表进行join操作。

一般来说,对于可预见的、不断增长的数据,业务分库可能最先进行的sharding。

3.垂直切分

垂直切分:将一个表按照字段分成多表,每个表存储一部分字段。表可以放在不同存储设备上。

其实,在最初设计数据库的时候,因为是关系型数据库,或多或少都会去遵守一些设计范式。当设计的数据库表满足第一范式、第二范式、第三范式等等范式要求时,其实就已经进行了所谓的垂直切分。

即使按照范式设计了数据库表,但有些表是宽表,有很多可能很少使用的字段,这些字段可能是按照稀疏列进行管理的,也可能是大BLOB后大text字段。此外,表中的字段还可以划分为"热门字段和冷门字段",例如本文示例中,相比考生号、姓名、所属地区使用频繁程度,考生电话号码可能很少使用、身份证号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值