在互联网公司中,上至大厂,下到普通的公司企业,随着业务的发展,数据量的日积月累,对于数据库和表的设计和优化,显得尤为重要。其中关于分表分库的问题,在实际场景或者是面试中,亦是老生常谈。当我们明白了来龙去脉时,也就没那么复杂。
为什么需要分库分表最为直接便是机器性能的问题。性能的考虑都来源于数据量。当数据量大的时候,随着而来便是高性能,可拓展,稳定性。当是业务刚开始,数据量小,为了控制成本,单机器是足够用的。但是随着业务的发展。在单台机器中无论是CPU、IO等资源,都是极为有限的。正所谓人多势众,双拳难敌四手,都是围绕强调不要孤军作战。所以,分表分库,亦或是读写分离都是为了更好的提高性能,提供更为稳定的服务。对于分表分库。主要是围绕这垂直和水平的二种拆分相结合的方式。
垂直拆分1、库的垂直拆分:
库的垂直拆分主要是针对系统的一些数据量较为大的业务进行分解。如常见业务的:用户数据(注册,登录的信息等),商品信息,订单等等,这些相对而言数据量和读写次数都是较多的。最好是进行分库,部署在不同的机器上面,突破单机器的限制。
2、表的垂直拆分:
也就是针对表的字段进行拆分,将一个大表拆分为多个小表,也就是数据库中的范式原则。也可以将字段按属性或使用频繁程度分类,拆分为多个表,比如一个主要的信息表和一个拓展信息表等等
只采用垂直拆分的话,依旧会存在单表数据量过大的问题。所以需要结合水平拆分的方法。
水平拆分1、只水平分表
针对数据量巨大的单张表(比如用户表,订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面去,可以有效的解决了单一表数据量过大的问题。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。例如:
原本一千万的user表数据,可以拆分为(user_1,user_2,user_3,user_4)这样的话,数据就分摊到不同的表中
2、水平分库分表
将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈。但是随着而来的事务也就成了分布式事务了,联合查询的效率也会下降。
常见水平分表拆分手段1、RANGE:从0到100一个表,101到200一个表;
2、HASH取模:用户注册的时候,可以根据用户的名称,会在用户的id 进行hash取模,分配到不同的表上
3、时间维度:比如用户的登录记录信息,可以安装年+月的结构分摊数据,如 login_202107、login_202103
如果不想自己实现分表分库的的问题,现在市场上也有一些比较成熟的产品可以使用,如360的(Atlas)、阿里的(TDDL)
共同进步,学习分享觉得写的还不错的就点个赞,加个关注呗!持续更新 !!! 点关注,不迷路,小杨带你上高速
已经为大家整理好了几百本各类技术电子书和学习资料、最新的面试题,注公众号【写代码的小杨】回复【资料】无套路领取,也欢迎大家一起来讨论学习,共同进步