微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

分库和分表

为什么要分库分表

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

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

如何选择

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

原文地址:https://www.jb51.cc/wenti/3286009.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐