分库和分表

为什么要分库分表

当一张表随着时间和业务的发展,库里表的数据量会越来越大,数据操作也会随之越来越大。一台机器的承载能力是有限的,达到了这个量后,数据的处理能力就会受限制,这时候就用到了分库和分表。
一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。

mysql执行一个sql的过程如下:

  • 1,接收到sql
  • 2,把sql放到排队队列中
  • 3,执行sql
  • 4,返回执行结果

在这个执行过程中最花时间在什么地方呢?
第一,是排队等待的时间,
第二,sql的执行时间。其实这二个是一回事,等待的同时,肯定有sql在执行。所以我们要缩短sql的执行时间。

mysql中有一种机制是表锁定和行锁定,为什么要出现这种机制,是为了保证数据的完整性;
我举个例子来说吧,如果有二个sql都要修改同一张表的同一条数据,这个时候怎么办呢,是不是二个sql都可以同时修改这条数据呢?
很显然mysql对这种情况的处理是,一种是表锁定(myisam存储引擎),一个是行锁定(innodb存储引擎)。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作.如果数据太多,一次执行的时间太长,等待的时间就越长,这也是我们为什么要分表的原因。

垂直切分

表按照功能模块,关系密切程度划分出来,部署到不同的库上,划分的原则一般是频繁变化的分为一个表,不频繁变化的,尤其大字段,如text和blob字段这种影响io性能的划分为另外一个表中,用户数据库 商品数据库 分别存储不同的数据,这样就实现了垂直分表。

在这里插入图片描述

垂直分库:
使原本在同一数据库中的表拆分到不同数据库(节点)中,操作不同数据库中的表要使用分布式事务,事务的使用变得复杂。另外,跨库的多表关联查询性能较差。

垂直分表:
使原本一张表中的字段拆分到多张表中,不同表之间的操作需要多表关联查询,连接查询性能较差
垂直切分提升了单表查询的性能,但增加了多表关联查询的次数。

水平切分

垂直切分只是减少了单表的字段数,但并没有减少单表的记录数。水平切分是将单表中的记录拆分到多张表中。
比如根据传递的id取余来决定去哪张表中查询

在这里插入图片描述

库内分表 :将拆分出来的新表放在同一数据库中
分库分表 :将拆分出来的新表放在不同的数据库中
库内分表:只解决了单表记录数过多的问题,但拆分出来的表竞争同一个机器的CPU、内存、网络IO,并没有减轻数据库的存储压力。

如何选择

如果数据库是因为表太多而造成海量数据,并且项目的各项业务逻辑划分清晰、低耦合,那么规则简单明了、容易实施的垂直切分必是首选。
而如果数据库中的表并不多,但单表的数据量很大、或数据热度很高,这种情况之下就应该选择水平切分,水平切分比垂直切分要复杂一些,它将原本逻辑上属于一体的数据进行了物理分割,除了在分割时要对分割的粒度做好评估,考虑数据平均和负载平均,后期也将对项目人员及应用程序产生额外的数据管理负担。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值