精华内容
下载资源
问答
  • 垂直分表:把的大字段,并且不是经常查询,单独的放入到一张去(这样也便于建立索引) 水平分库方式主要根据用户属性(比如市里面的县分别放到不同的库中)拆分物理数据库。 垂直分库方式:根据业务维...

    一、前言

    中大型项目中,一旦遇到数据量比较大,小伙伴应该都知道就应该对数据进行拆分了。首先介绍一下常用的分库分表策略:

    水平分表:把一个表拆分按某个字段拆分成多个表 (比如按照ID将原表拆成多个表)

    垂直分表:把表的大字段,并且不是经常查询,单独的放入到一张表去(这样也便于建立索引)

    水平分库方式主要根据用户属性(比如市里面的县分别放到不同的库中)拆分物理数据库。
    垂直分库方式:根据业务维度和数据的访问量等,进行数据的分离,剥离为多个数据库。(收藏夹和博客的库分开)
     

    用图示的方式再介绍一下分表:

    有垂直和水平两种

    垂直拆分比较简单,也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库。如下图,独立的拆分出订单库和用户库。

    水平拆分的概念,是同一个业务数据量大之后,进行水平拆分。

     

    上图中订单数据达到了4000万,我们也知道mysql单表存储量推荐是百万级,如果不进行处理,mysql单表数据太大,会导致性能变慢。使用方案可以参考数据进行水平拆分。把4000万数据拆分4张表或者更多。当然也可以分库,再分表;把压力从数据库层级分开。

    本文要介绍的是水平分库分表:

     

    二、分库分表方案

    分库分表方案中有常用的方案,hash取模和range范围方案;分库分表方案最主要就是路由算法,把路由的key按照指定的算法进行路由存放。下边来介绍一下两个方案的特点。

    1、hash取模方案

     

     

    在我们设计系统之前,可以先预估一下大概这几年的订单量,如:4000万。每张表我们可以容纳1000万,也我们可以设计4张表进行存储。

    那具体如何路由存储的呢?hash的方案就是对指定的路由key(如:id)对分表总数进行取模,上图中,id=12的订单,对4进行取模,也就是会得到0,那此订单会放到0表中。id=13的订单,取模得到为1,就会放到1表中。为什么对4取模,是因为分表总数是4。

    • 优点:

    订单数据可以均匀的放到那4张表中,这样此订单进行操作时,就不会有热点问题。

    热点的含义:热点的意思就是对订单进行操作集中到1个表中,其他表的操作很少。

    订单有个特点就是时间属性,一般用户操作订单数据,都会集中到这段时间产生的订单。如果这段时间产生的订单 都在同一张订单表中,那就会形成热点,那张表的压力会比较大。

    • 缺点:

    将来的数据迁移和扩容,会很难。

    如:业务发展很好,订单量很大,超出了4000万的量,那我们就需要增加分表数。如果我们增加4个表

    一旦我们增加了分表的总数,取模的基数就会变成8,以前id=12的订单按照此方案就会到4表中查询,但之前的此订单时在0表的,这样就导致了数据查不到。就是因为取模的基数产生了变化。

    遇到这个情况,我们小伙伴想到的方案就是做数据迁移,把之前的4000万数据,重新做一个hash方案,放到新的规划分表中。也就是我们要做数据迁移。这个是很痛苦的事情。有些小公司可以接受晚上停机迁移,但大公司是不允许停机做数据迁移的。

    当然做数据迁移可以结合自己的公司的业务,做一个工具进行,不过也带来了很多工作量,每次扩容都要做数据迁移

    那有没有不需要做数据迁移的方案呢,我们看下面的方案

    2、range范围方案

    range方案也就是以范围进行拆分数据。

     

    range方案比较简单,就是把一定范围内的订单,存放到一个表中;如上图id=12放到0表中,id=1300万的放到1表中。设计这个方案时就是前期把表的范围设计好。通过id进行路由存放。

    • 优点

    我们小伙伴们想一下,此方案是不是有利于将来的扩容,不需要做数据迁移。即时再增加4张表,之前的4张表的范围不需要改变,id=12的还是在0表,id=1300万的还是在1表,新增的4张表他们的范围肯定是 大于 4000万之后的范围划分的。

    • 缺点

    有热点问题,我们想一下,因为id的值会一直递增变大,那这段时间的订单是不是会一直在某一张表中,如id=1000万 ~ id=2000万之间,这段时间产生的订单是不是都会集中到此张表中,这个就导致1表过热,压力过大,而其他的表没有什么压力。

    3、总结:

    hash取模方案:没有热点问题,但扩容迁移数据痛苦

    range方案:不需要迁移数据,但有热点问题。

    那有什么方案可以做到两者的优点结合呢?,即不需要迁移数据,又能解决数据热点的问题呢?

    其实还有一个现实需求,能否根据服务器的性能以及存储高低,适当均匀调整存储呢?

     

    三、方案思路

    hash是可以解决数据均匀的问题,range可以解决数据迁移问题,那我们可以不可以两者相结合呢?利用这两者的特性呢?

    我们考虑一下数据的扩容代表着,路由key(如id)的值变大了,这个是一定的,那我们先保证数据变大的时候,首先用range方案让数据落地到一个范围里面。这样以后id再变大,那以前的数据是不需要迁移的

    但又要考虑到数据均匀,那是不是可以在一定的范围内数据均匀的呢?因为我们每次的扩容肯定会事先设计好这次扩容的范围大小,我们只要保证这次的范围内的数据均匀是不是就ok了。

     

    四、方案设计

    我们先定义一个group组概念,这组里面包含了一些分库以及分表,如下图

     

    上图有几个关键点:

    1)id=0~4000万肯定落到group01组中

    2)group01组有3个DB,那一个id如何路由到哪个DB?

    3)根据hash取模定位DB,那模数为多少?模数要为所有此group组DB中的表数,上图总表数为10。为什么要去表的总数?而不是DB总数3呢?

    4)如id=12,id%10=2;那值为2,落到哪个DB库呢?这是设计是前期设定好的,那怎么设定的呢?

    5)一旦设计定位哪个DB后,就需要确定落到DB中的哪张表呢?

    五、核心主流程

     

    按照上面的流程,我们就可以根据此规则,定位一个id,我们看看有没有避免热点问题。

    我们看一下,id在【0,1000万】范围内的,根据上面的流程设计,1000万以内的id都均匀的分配到DB_0,DB_1,DB_2三个数据库中的Table_0表中,为什么可以均匀,因为我们用了hash的方案,对10进行取模。

    上面我们也提了疑问,为什么对表的总数10取模,而不是DB的总数3进行取模?我们看一下为什么DB_0是4张表,其他两个DB_1是3张表?

    在我们安排服务器时,有些服务器的性能高,存储高,就可以安排多存放些数据,有些性能低的就少放点数据。如果我们取模是按照DB总数3,进行取模,那就代表着【0,4000万】的数据是平均分配到3个DB中的,那就不能够实现按照服务器能力适当分配了。

    按照Table总数10就能够达到,看如何达到

     

    上图中我们对10进行取模,如果值为【0,1,2,3】就路由到DB_0,【4,5,6】路由到DB_1,【7,8,9】路由到DB_2。现在小伙伴们有没有理解,这样的设计就可以把多一点的数据放到DB_0中,其他2个DB数据量就可以少一点。DB_0承担了4/10的数据量,DB_1承担了3/10的数据量,DB_2也承担了3/10的数据量。整个Group01承担了【0,4000万】的数据量。

    注意:小伙伴千万不要被DB_1或DB_2中table的范围也是0~4000万疑惑了,这个是范围区间,也就是id在哪些范围内,落地到哪个表而已。

    上面一大段的介绍,就解决了热点的问题,以及可以按照服务器指标,设计数据量的分配。

     

    六、如何扩容

    其实上面设计思路理解了,扩容就已经出来了;那就是扩容的时候再设计一个group02组,定义好此group的数据范围就ok了。

     

    因为是新增的一个group01组,所以就没有什么数据迁移概念,完全是新增的group组,而且这个group组照样就防止了热点,也就是【4000万,5500万】的数据,都均匀分配到三个DB的table_0表中,【5500万~7000万】数据均匀分配到table_1表中。

    七、系统设计

     

     

    思路确定了,设计是比较简单的,就3张表,把group,DB,table之间建立好关联关系就行了。

                                                                                     group和DB的关系

                                                                                             table和db的关系

    上面的表关联其实是比较简单的,只要原理思路理顺了,就ok了。小伙伴们在开发的时候不要每次都去查询三张关联表,可以保存到缓存中(本地jvm缓存),这样不会影响性能。

    一旦需要扩容,小伙伴是不是要增加一下group02关联关系,那应用服务需要重新启动吗?

    简单点的话,就凌晨配置,重启应用服务就行了。但如果是大型公司,是不允许的,因为凌晨也有订单的。那怎么办呢?本地jvm缓存怎么更新呢?

    其实方案也很多,可以使用用zookeeper,也可以使用分布式配置,这里是比较推荐使用分布式配置中心的,可以将这些数据配置到分布式配置中心去,对分布式配置中心不了解的,可以看下《三种主流的微服务配置中心深度对比!你怎么看!

    补充:

    现在其实建议考量的,就是 sharding-jdbc 和 mycat,这两个都可以去考虑使用。

    sharding-jdbc 这种 client 层方案的优点在于不用部署,运维成本低,不需要代理层的二次转发请求,性能很高,但是如果遇到升级啥的需要各个系统都重新升级版本再发布,各个系统都需要耦合 sharding-jdbc 的依赖;

    mycat 这种 proxy 层方案的缺点在于需要部署,自己运维一套中间件,运维成本高,但是好处在于对于各个项目是透明的,如果遇到升级之类的都是自己中间件那里搞就行了。

    通常来说,这两个方案其实都可以选用,但是我个人建议中小型公司选用 sharding-jdbc,client 层方案轻便,而且维护成本低,不需要额外增派人手,而且中小型公司系统复杂度会低一些,项目也没那么多;但是中大型公司最好还是选用 mycat 这类 proxy 层方案,因为可能大公司系统和项目非常多,团队很大,人员充足,那么最好是专门弄个人来研究和维护 mycat,然后大量项目直接透明使用即可。

    展开全文
  • • 使用数据列表功能创建动态数据透视 • 按日期或时间项组合 • 按数字项组合 • 指定项组合 • 创建计算字段 • 添加下计算项 • 获取Excel数据透视表数据 • 创建复合范围的Excel数据透视数据透视图 • ...
  • 程序开发范例宝典>>

    2012-10-24 10:41:28
    技术、硬件相关开发技术、网络开发技术、Web编程、加密、安全与软件注册、数据结构与算法、C#高级开发、实用工具、程序打包等共21章,572个实例。  本书附有配套光盘。光盘提供了书中所有实例的源代码,全部源...
  • 技术、硬件相关开发技术、网络开发技术、Web编程、加密、安全与软件注册、数据结构与算法、C#高级开发、实用工具、程序打包等共21章,572个实例。  本书附有配套光盘。光盘提供了书中所有实例的源代码,全部源...
  • 技术、硬件相关开发技术、网络开发技术、Web编程、加密、安全与软件注册、数据结构与算法、C#高级开发、实用工具、程序打包等共21章,572个实例。  本书附有配套光盘。光盘提供了书中所有实例的源代码,全部源...
  • 技术、硬件相关开发技术、网络开发技术、Web编程、加密、安全与软件注册、数据结构与算法、C#高级开发、实用工具、程序打包等共21章,572个实例。  本书附有配套光盘。光盘提供了书中所有实例的源代码,全部源...
  • 内容包括窗体与界面设计、控件应用、数据处理技术、图形技术、多媒体技术、文件系统、操作系统与window相关程序、注册表、数据库技术、sql查询相关技术、打印与报表技术、图表技术、硬件相关开发技术、网络开发技术...
  • 图书作者: 明日科技 图书编号: 9787115277589 ...实例262 利用数据集组件实现临时的存储功能 341 实例263 制作简单的数据库操作软件 342 8.3 图片、多媒体数据录入技术 343 实例264 向access数据库...
  • 实例301 利用变量查询字符串型数据 403 实例302 利用变量查询日期型数据 404 9.3 数据前若干名 406 实例303 查询前10名数据 406 实例304 查询后10名数据 407 实例305 取出数据统计结果前10名数据 408 ...
  • 一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,...实例292 建立数据文件与程序的关联 390 实例293 使应用程序开机...
  •  实例054 将数据表中的字段添加到ComboBox控件 59  实例055 带查询功能的ComboBox控件 61  2.4 RichTextBox控件应用 63  实例056 利用RichTextBox控件实现文档管理功能 63  实例057 利用RichTextBox...
  • C#程序开发范例宝典(第2版).part02

    热门讨论 2012-11-12 07:55:11
    实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...
  • 实例054 将数据表中的字段添加到ComboBox控件 59 实例055 带查询功能的ComboBox控件 61 2.4 RichTextBox控件应用 63 实例056 利用RichTextBox控件实现文档管理功能 63 实例057 利用RichTextBox控件实现文字...
  • C#程序开发范例宝典(第2版).part13

    热门讨论 2012-11-12 20:17:14
    实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...
  • 实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...
  • 实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...
  • 实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...
  • 实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...
  • 实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...
  • 实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...
  • 实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...
  • 实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...
  • 实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...
  • 实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...
  • C#.net_经典编程例子400个

    热门讨论 2013-05-17 09:25:30
    57 2.2 Button控件应用 58 实例053 在Button按钮中显示图标 58 2.3 ComboBox控件应用 59 实例054 将数据表中的字段添加到ComboBox控件 59 实例055 带查询功能的ComboBox控件 61 2.4 ...
  • 第1篇为基础篇,内容包括快速输入与编辑数据、快速格式化工作、高效管理表格数据、SmartArt图形与图表的应用、公式与函数的运用、数据的有效保护等6个章节。第2篇为实例篇,重点介绍如何使用Excel解决文秘工作中的...
  • 实例229 将数据表中的字段添加到ComboBox控件中 实例230 在ComboBox下拉列表中显示图片 实例231 用ComboBox控件制作浏览器网址输入框 实例232 实现带查询功能的ComboBox控件 11.4 RichTextBox控件应用 实例233...
  • 实例229 将数据表中的字段添加到ComboBox控件中 实例230 在ComboBox下拉列表中显示图片 实例231 用ComboBox控件制作浏览器网址输入框 实例232 实现带查询功能的ComboBox控件 11.4 RichTextBox控件应用 实例233...
  • 实例229 将数据表中的字段添加到ComboBox控件中 实例230 在ComboBox下拉列表中显示图片 实例231 用ComboBox控件制作浏览器网址输入框 实例232 实现带查询功能的ComboBox控件 11.4 RichTextBox控件应用 实例233...

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
关键字:

如何建立垂直数据查询表