随着近些年信息化大跃进,各行各业无纸化办公产生了大量的数据,而愈来愈多的数据存入了数据库中。当使用MySQL
数据库的时候,单表超出了2000万数据量就会出现性能上的分水岭。而且物理服务器的CPU、内存、存储、链接数等资源有限,某个时段大量链接同时执行操做,会致使数据库在处理上遇到性能瓶颈。为了解决这个问题,行业先驱门充分发扬了分而治之
的思想,对大表进行分割,而后实施更好的控制和管理,同时使用多台机器的CPU、内存、存储,提供更好的性能。而分而治之
则有两种方式:垂直拆分
和水平拆分
。html
垂直拆分分为垂直分库
和垂直分表
。先说说垂直分库
。垂直分库实际上是一种简单逻辑分割。好比咱们的数据库中有商品表Products、还有对订单表Orders,还有积分表Scores。接下来咱们就能够建立三个数据库,一个数据库存放商品,一个数据库存放订单,一个数据库存放积分。以下图所示:算法
垂直分库
有一个优势,他可以根据业务场景进行孵化,好比某一单一场景只用到某2-3张表,基本上应用和数据库能够拆分出来作成相应的服务。数据库
再来讲说垂直分表
,比较适用于那种字段比较多的表,假设咱们一张表有100个字段,咱们分析了一下当前业务执行的SQL语句,有20个字段是常用的,而另外80个字段使用比较少。这样咱们就能够把20个字段放在主表里面,咱们在建立一个辅助表,存放另外80个字段。固然主表和辅助表都是有主键的。他们经过主键进行关联合并,就能够凑成100个字段的表。缓存
垂直分表
能够解决跨页
的问题。在Oracle中叫行连接。怎么理解呢?就是你字段少的状况下,本来一行数据只须要存在一个页里面就好了,可是字段多的状况就存不下了,就须要跨页。这样就会形成额外寻址,形成性能上的开销。另外将这么长的一行数据载到内存中,每每是几个页面,结果我们常常只访问其中的几个字段,对内存也是一个极大的开销。因此为了让内存缓存更多数据,减小磁盘I/O,垂直分表
就是很好的手段。服务器
整体来讲:垂直拆分
有如下优势:并发
垂直拆分
的缺点:分布式
当某张表数据量达到必定的程度的时候,前面曾说过MySQL单表出现2000万以上数据就会出现性能上的分水岭。此时发现没有办法根据业务规则再进行拆分了,就会致使单库上的读写性能出现瓶颈。此时就只能进行水平拆分了。微服务
水平拆分又分为库内分表
和分库分表
。先说说库内分表
。假设当咱们的Orders表达到了5000万行记录的时候,很是影响数据库的读写效率,怎么办呢?咱们能够考虑按照订单编号的order_id进行rang分区,就是把订单编号在1-1000万的放在order1表中,将编号在1000万-2000万的放在order2中,以此类推,每一个表中存放1000万数据。以下图所示:高并发
虽然咱们能够经过库内分表
把单表的容量固定在1000万,可是这些表的数据仍然存放在一个库内,使用的是该主机的CPU、IO、内存。单库的链接数也有限制。并不能彻底的下降系统的压力。此时,咱们就要考虑另一种技术叫分库分表
。分库分表在库内分表的基础上,将分的表挪动到不一样的主机和数据库上。能够充分的使用其余主机的CPU、内存和IO资源。而且分库以后,单库的链接数限制也不在成为瓶颈。可是“成也萧何败也萧何”,若是你执行一个扫描不带分片键,则须要在每一个库上查一遍。刚刚咱们按照order_id分红了5个库,可是咱们查询是name='AAA'的条件而且不带order_id字段时,它并不知道在哪一个分片上查,则会建立5个链接,而后每一个库都检索一遍。这种广播查询则会形成链接数增多。由于它须要在每一个库上都创立链接。若是是高并发的系统,执行这种广播查询,系统的thread很快就会告警。性能
整体来讲:水平拆分
的优势有如下:
水平拆分
的缺点:
当前咱们的系统,垂直拆分
和水平拆分
都在使用,垂直拆分
主要是作业务上的分割,把业务的各个子系统都规划好,能解耦就解耦。而垂直拆分以后。咱们再作水平分库分表。经过取模算法将大表数据拆到若干个库中。
介绍了上述的分库分表,咱们有必要说一下几个概念,一个是逻辑库
和物理库
的概念。咱们仍是拿水平拆分中的分库分表
来讲。咱们在物理层面,将一个库的数据分割到了5个数据库中。这5个数据库就是物理库
,而它们对上层应用的展示则是一个库。这个对上层展示的库就叫逻辑库
。逻辑库对应用层是透明的。应用不须要了解底层的状况,直接使用就好了。
仍是拿水平拆分中的分库分表
来讲,orders表总共被分红了5份,分别在底层是orders_1~5。这底层的5个表就是物理表。可是对应用层面来讲,只有orders表。这就是逻辑表
。
总结:这一篇主要是讲述一些分库分表以后的概念。须要加深一些理解,由于咱们的项目也才是刚刚开始拆分,因此有写的不对的地方还但愿小伙伴们提出意见指正。