精华内容
下载资源
问答
  • 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。通过数据切分来提高网站性能,这里整理一份数据库表的垂直切分与水平切分文档供大家研究!
  • 数据库垂直切分与水平切分

    千次阅读 2019-06-27 14:50:10
    1. 为什么要拆分数据库?  单体项目在构建之初,数据库的负载和数据量都不大,所以不需要对数据库做拆分,小型财务系统、文书系统、ERP系统、OA系统,用一个MySQL数据库实例基本就够用了。  就像《淘宝技术这十年...

      1. 为什么要拆分数据库?

      单体项目在构建之初,数据库的负载和数据量都不大,所以不需要对数据库做拆分,小型财务系统、文书系统、ERP系统、OA系统,用一个MySQL数据库实例基本就够用了。

      就像《淘宝技术这十年》里面说到的,电商业务的数据量增长飞快,所以最开始的PHP+MySQL的架构已经不能满足实际要求了,于是淘宝想到的第一个办法就是把MySQL替换成Oracle。但是没过了多久,在08年前后,单节点的Oracle数据库也不好用了,于是淘宝终于告别了单节点数据库,开始拆分数据库。从一个节点,变成多个节点。

      拆分数据库是有讲究的,比如说拆分方法有两种:垂直切分和水平切分。那你是先水平切分还是垂直切分呢?顺序无所谓?不,顺序有所为,次序绝对不能错:先水平切分,然后垂直切分。

      2. 什么是垂直切分?

      垂直切分是根据业务来拆分数据库,同一类业务的数据表拆分到一个独立的数据库,另一类的数据表拆分到其他数据库。

      比如说一个新零售的电商数据库,我们可以把跟商品相关的数据表拆分成一个数据库,然后在这些数据表的基础之上,构建出商品系统。比如用JAVA或者PHP语言,创建出一个商城系统。然后把跟进销存相关的数据表拆分到另外一个数据库上,再用程序构建出仓库系统。

      

    图片描述

     

      垂直切分解决了什么问题

      垂直切分可以降低单节点数据库的负载。原来所有数据表都放在一个数据库节点上,无疑所有的读写请求也都发到这个MySQL上面,所以数据库的负载太高。如果把一个节点的数据库拆分成多个MySQL数据库,这样就可以有效的降低每个MySQL数据库的负载。

      垂直切分不能解决什么问题

      垂直切分不能解决的是缩表,比如说商品表无论划分给哪个数据库节点,商品表的记录还是那么多,不管你把数据库垂直拆分的有多细致,每个数据表里面的数据量是没有变化的。

      MySQL单表记录超过2000万,读写性能会下降的很快,因此说垂直切分并不能起到缩表的效果。

      3. 什么是水平切分?

      水平切分是按照某个字段的某种规则,把数据切分到多张数据表。一张数据表化整为零,拆分成多张数据表,这样就可以起到缩表的效果了。

      

    图片描述

     

      很多人,都会水平切分存在误解,以为水平切分出来的数据表必须保存在不同的MySQL节点上。其实水平切分出来的数据表也可以保存在一个MySQL节点上面。不是水平切分一定需要多个MySQL节点。为什么这么说呢?

      许多人不知道MySQL自带一种数据分区的技术,可以把一张表的数据,按照特殊规则,切分存储在不同的目录下。如果我们给Linux主机挂载了多块硬盘,我们完全可以利用MySQL分区技术,把一张表的数据切分存储在多个硬盘上。这样就由原来一块硬盘有限的IO能力,升级成了多个磁盘增强型的IO。如果你感兴趣数据分区的具体效果,可以看《MySQL数据库集群》这门实战课。

      水平切分的用途

      水平切分可以把数据切分到多张数据表,可以起到缩表的作用。

      但是也不是所有的数据表都要做水平切分。数据量较大的数据表才需要做数据切分,比如说电商系统中的,用户表、商品表、产品表、地址表、订单表等等。有些数据表就不需要切分,因为数据量不多,比如说品牌表、供货商表、仓库表,这些都是不需要切分的。

      水平切分的缺点

      不同数据表的切分规则并不一致,要根据实际业务来确定。所以我们在选择数据库中间件产品的时候,就要选择切分规则丰富的产品。常见的数据库中间件有:MyCat、Atlas、ProxySQL等等。有些人觉得MyCat是Java语言开发的,就怀疑MyCat运行效率。其实数据库中间件的作用相当于SQL语句的路由器。你家路由器硬件配置不怎么高,但是不影响你享用百兆宽带。MyCat也是一个道理,它仅仅是起到SQL语句转发的作用,并不会实际执行SQL语句。我推荐使用MyCat最主要的原因是它自带了非常多的数据切分规则,我们可以按照主键求模切分数据,可以按照主键范围切分数据,还可以按照日期切分数据等等。因此说,为了满足业务的需要,MyCat目前来说算是非常不错的中间件产品。

      水平切分的另一个缺点就是扩容比较麻烦,日积月累,分片迟早有不够用的时候。这时候不是首先选择增加新的集群分片。因为一个MySQL分片,需要4~8个MySQL节点(最小规模),增加一个分片的投入成本是很高的。所以正确的做法是做冷热数据分离,定期对分片中的数据归档。把过期的业务数据,从分片中转移到归档库。目前来说数据压缩比最高的MySQL引擎是TokuDB,而且带着事物的写入速度是InnoDB引擎的6-14倍。用TokuDB作为归档数据库最适合不过。

      

    图片描述

     

      4. 为什么先做水平切分,后作垂直切分?

      随着数据量的增加,最先应该做的是数据分片,利用多块硬盘来增大数据IO能力和存储空间,这么做的成本是最低的。几块硬盘的钱就能收获不错的IO性能。

      进入到下一个阶段,数据量继续增大,这时候我们应该把数据切分到多个MySQL节点上,用MyCat管理数据切分。当然还要做数据的读写分离等等,这里不展开讨论。在后台做水平切分的同时,业务系统也可以引入负载均衡、分布式架构等等。理论上,使用了冷热数据分离之后,水平切分这种方式可以继续维持很长一段时间,数据量再大也不怕,定期归档就好了。

      数据库到了水平切分的阶段,数据量的增加已经不是更改架构设计的主要原因了。反而这个阶段业务系统承受不住了,如果再不对系统做模块拆分,业务系统也撑不下去了,所以按照模块和业务,把一个系统拆分成若干子系统。若干子系统之间,数据相对独立。比如淘宝不会跟支付支付宝分享全部数据,共享同一套数据表,这也影响各自业务的发展。所以就要弄垂直切分了,把数据表归类,拆分成若干个数据库系统。

      讲到这里,你仔细想想。如果过早的对数据库做了垂直切分,势必要重新构建若干独立的业务系统,工作量太巨大。水平切分并不需要业务系统做大幅度的修改,因此说应该先从水平切分开始做。

    展开全文
  • 下面笔记记一下对数据库水平切分的理解 我们常见的数据库瓶颈是什么呢? 举个栗子,双十一我们在电商那里购物,十几亿人刷刷刷,秒秒秒,订单越来越多,越来越多。加上我们的历史订单,好几年前的都在。那数据量...

    下面笔记记一下对数据库水平切分的理解

    我们常见的数据库瓶颈是什么呢?

    举个栗子,双十一我们在电商那里购物,十几亿人刷刷刷,秒秒秒,订单越来越多,越来越多。加上我们的历史订单,好几年前的都在。那数据量可是大的惊天地泣鬼神啊,咋办?那可是存在一张表里头的啊。

    数据库的读性能瓶颈我们已经靠缓存解决了,那么就只剩下写的性能了对吧。

    一般像mysql,百万级的数据都还凑合,上千万就到瓶颈了。那么我们该如何解决这个瓶颈呢?

    1.垂直切分

    所谓垂直切分就是所谓的AOP化,这个AOP咋这么眼熟呢?java里管这个叫做面向切面编程,大概意思就是说,编程的时候,我们把各个业务逻辑分开,主要业务的运行不受其他杂七杂八的次要业务的干扰,当然次要是相对的。比如说事务啊、日志啊、权鉴啊等等。把这群杂七杂八的业务都各自做成一个服务,独立运行,不影响主业务。OK说了这么多,重要的只有一句,那就是服务化AOP。

    那什么是垂直切分能,它又与服务化有什么关系呢?

    我们说一东西是庞然大物,要么是因为它太大了,要么是太高了,要么就是又高又大。

    横向的“太大”我们就可以用垂直切分,让它“苗条”起来。数据也一样,我们可以把一张表的字段,根据业务或者是功能模块的分成若干张表。这若干张表用主键来联系。这样做的好处不明而喻:

    • 数据库的拆分简单明了,拆分规则明确;
    • 应用程序模块清晰明确,整合容易;
    • 数据维护方便易行,容易定位;

    当然了,没有完美的技术,只有更合适的技术。垂直切分的缺点也很明显:

    • 部分表关联无法在数据库级别完成,需要在程序中完成(比如说join,count,order by,group by);
    • 单表大数据量仍然存在性能瓶颈(万一是又高又大的庞然大物呢?我们只是把它变得苗条了,但它太高了,也是一种瓶颈,不是吗?);
    • 事务处理相对更为复杂(只要是牵扯到事务就没简单的);
    • 切分达到一定程度之后,扩展性会遇到限制(由于主键的存在,表与表之间耦合性太强,一般耦合性太强的东西,扩展性都太差);

    当我们遇到的是又高又大的庞然大物,我们除了让它变苗条,还要让它变矮。木秀于林,风必摧之。反正不是什么好事。于是乎,我们要将数据库水平切分,就是把里面的数据拦腰斩断,分成好几块(玛雅太血腥了吧),我们一只箱子装不下,我们装几个箱子。当然,里面的数据不能像量子那样玄,那你分成了几份装起来就不可能会有交集。几个数据库的并集就是一份完整的数据。

    水平切分的优点

    • 解决单表大数据量性能遇到瓶颈的问题;
    • 应用程序端整体架构改动相对较少;
    • 事务处理相对简单;
    • 只要切分规则能够定义好,基本上较难遇到扩展性限制;

    水平切分的缺点

    1.切分规则相对更为复杂,很难抽象出一个能够满足整个数据库的切分规则

    首先是主键ID的拆分问题:

    水平切了,主键就不能用数据库自己的ID生成方式了,不然很难保证各个库同表的ID唯一性

    UUID也不是好办法,因为它太长了。小伙伴要是做过数据库调优就知道,那么长的东西根本不适合做ID,这会给建立索引和根据索引查询带来很大的性能问题,而且还影响写的速度。下面引用网友的解释

    nnodb 中的主键是聚簇索引,会把相邻主键的数据安放在相邻的物理存储上。如果主键不是自增,而是随机的,那么频繁的插入会使 innodb 频繁地移动磁盘块,而影响写入性能。

    至于解决办法可以参考twitter的分布式自增ID算法Snowflake

    2.后期数据的维护难度有所增加,人为手工定位数据更困难;

    3.应用系统各模块耦合度较高,可能会对后面数据的迁移拆分造成一定的困难。

    未完待续...

    本文原创,如需转载请注明出处。

     

     

     

    展开全文
  • 一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面。 水平拆分:垂直拆分后遇到单机瓶颈,可以使用水平...

    垂直拆分:专库专用。 一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面。 水平拆分:垂直拆分后遇到单机瓶颈,可以使用水平拆分。相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中。相对于垂直拆分,水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中 的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,主要有分表,分库两种模式

    在这里插入图片描述

    展开全文
  • 数据切分可以是物理上的,对数据通过一系列的切分...数据切分也可以是数据库内的,对数据通过一系列的切分规则,将数据分布到一个数据库的不同表中,比如将article分为article_001,article_002等子表,若干个子表水平

    数据切分可以是物理上的,对数据通过一系列的切分规则将数据分布到不同的DB服务器上,通过路由规则路由访问特定的数据库,这样一来每次访问面对的就不是单台服务器了,而是N台服务器,这样就可以降低单台机器的负载压力。

    据切分也可以是数据库内的,对数据通过一系列的切分规则,将数据分布到一个数据库的不同表中,比如将article分为article_001,article_002等子表,若干个子表水平拼合有组成了逻辑上一个完整的article表,这样做的目的其实也是很简单的。 举个例子说明,比如article表中现在有5000w条数据,此时我们需要在这个表中增加(insert)一条新的数据,insert完毕后,数据库会针对这张表重新建立索引,5000w行数据建立索引的系统开销还是不容忽视的。但是反过来,假如我们将这个表分成100 个table呢,从article_001一直到article_100,5000w行数据平均下来,每个子表里边就只有50万行数据,这时候我们向一张只有50w行数据的table中insert数据后建立索引的时间就会呈数量级的下降,极大了提高了DB的运行时效率,提高了DB的并发量。当然分表的好处还不知这些,还有诸如写操作的锁操作等,都会带来很多显然的好处。

    综上,分库降低了单点机器的负载;分表,提高了数据操作的效率,尤其是Write操作的效率。

    展开全文
  • 垂直切分分为垂直分库和垂直分表两种 垂直分库 依据业务的耦合性进行拆分,将关联度低的不同表存储在不同的数据库。就像我们的微服务,每个微服务就是一个独立业务功能 垂直分表 垂直分表就是将一个表中的多个...
  • 一、垂直切分 1、垂直分表: 定义:操作数据库中的某张表,将其中一部分字段数据存到一张新表中,再将另一部分字段数据存到另一张表中。如下图: 2、垂直分库: 定义:将单一数据库按照业务进行划分,做到专库专表...
  • 其实,相对于垂直切分更进一步的是服务化改造,说得简单是要把原来强耦合的系统拆分成多个弱耦合的服务,通过服务间的调用来满足业务需求看,因此表拆出来后要通过服务的形式暴露出去,而不是直接调用不同模块的表,...
  • 通过MySQLReplication功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我们还是会面临到扩展瓶颈。这时候,我们就必须许找其他技术手段来解决这...
  • 在整理项目的时候,突然发现对数据库水平切分与垂直切分比较模糊,特此学习! 参考:https://www.cnblogs.com/bluebluesky/articles/6413831.html 1、数据库分区 就是把同一个数据库里的表放到不同的服务器上,...
  • 拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。 优点:拆分后业务清晰,拆分规则明确;便于开发和维护;避免“跨页”的问题(MySQL、MSSQL底层都是通过“数据页”来存储的,“跨页”问题...
  • 数据库垂直水平切分

    千次阅读 2017-09-18 22:56:28
    通过MySQLReplication功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我们还是会面临到扩展瓶颈。这时候,我们就必须许找其他技术手段来解决这...
  • 由于垂直切分是按照业务的分类将表分散到不同的库,所以有些业务表会过于庞大,存在单库读写存储瓶颈,所以就需要水平拆分来做解决。 水平切分 相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的...
  • 专业的MyBatis数据库切分框架 MyBatis Shards简介 MyBatis Shards在实现方式上完全借鉴于Hibernate Shards,目前可以认为是Hibernate Shards的一个迁移版本。 MyBatis Shards概述 MyBatis Shards采用无侵入性的方式...
  • 一、数据切分的概念:  指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上,以达到分散单台设备负载的效果。...一种是按照不同的表(或者Schema)来切分到不同的数据库...
  • 【分库分表】切分方式 - 简书 ...数据库切分指的是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果,即分库分表。 数据的切分...
  • 水平切分,然后垂直切分. 1.什么是垂直切分垂直切分是根据业务来拆分数据库,同一类业务的数据表拆分到一个独立的数据库,另一类的数据表拆分到其他数据库。 比如说一个新零售的电商数据库,我们可以把跟商品...
  • 数据库水平与垂直拆分:垂直(纵向)拆分:是指按功能模块拆分,比如分为订单库、商品库、用户库...这种方式多个数据库之间的表结构不同。水平(横向)拆分:将同一个表的数据进行分块保存到不同的数据库中,这些数据库...
  • 数据切分(sharding):通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。。数据的切分同时还可以提高系统的总体可用性,因为单台设备Crash之后,...
  • 垂直拆分  垂直拆分就是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在...其实,相对于垂直切分更进一步的是服务化改造,说得简单就是要把原来强耦合的系统拆分成多个弱耦合的服务,
  • 数据的切分(Sharding)根据其切分规则的类型,可以...一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是根据表中的数据的逻辑关系,将同...
  • 垂直拆分,水平拆分概念
  • Sharding-JDBC是当当网研发的开源分布式数据库中间件,从 3.0 开始Sharding-JDBC被包含在 Sharding-Sphere中,之后该项目进入Apache孵化器, 4.0版本之后的版本为Apache版本。 Sharding-JDBC是ShardingSphere的第...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,216
精华内容 4,886
关键字:

数据库的垂直切分与水平切分