分库和分表

为什么要分库分表

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

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,并没有减轻数据库的存储压力。

如何选择

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

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...