当前位置:首页 > 科技数码

分库分表 什么是数据库分库分表?

1. 前言

中大型项目中,一旦遇到数据量比较大,小伙伴应该都知道就应该对数据进行拆分了。有垂直和水平两种。

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

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

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

1.1 垂直拆分和水平拆分区别

1.1.1 垂直拆分

数据库的垂直拆分:

对业务表进行分类,不同的业务表划分到不同的数据库里

。这种形式的拆分往往是便随着服务化改造,按功能模块将原来强耦合的系统拆分为多个弱耦合的服务,此时往往就会进行数据库的垂直拆分。

数据表的垂直拆分: 是针对于数据表列的拆分,

把一张列比较多的表拆分为多张表。

垂直拆分的优点:

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

垂直拆分的缺点:

部分表关联无法在数据库级别完成,需要在程序中完成。单表大数据量仍然存在性能瓶颈。事务处理相对更为复杂。拆分达到一定程度之后,扩展性会遇到限制。

1.1.2 水平拆分

把一个表的数据按照某种规则化分到不同表或数据库里(水平拆分是按照行数据拆分)。

水平拆分的优点:

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

水平拆分缺点:

拆分规则相对更复杂,很难抽象出一个能够满足整个数据库的切分规则。后期数据的维护难度有所增加,人为手工定位数据更困难。产品逻辑将变复杂。比如按年来进行历史数据归档拆分,这个时候在页面设计上就需要约束用户必须要先选择年,然后才能进行查询。

总而言之

数据表垂直拆分: 单表复杂度。数据库垂直拆分: 功能拆分。水平拆分:分表:解决单表大数据量问题。 分库:为了解决单库性能问题。

2. 分库分表方案

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

2.1 hash取模方案

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

优点

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

缺点

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

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

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

遇到这个情况,我们小伙伴想到的方案就是

做数据迁移,把之前的4000万数据,重新做一个hash方案,放到新的规划分表中。也就是我们要做数据迁移。这个是很痛苦的事情。

有些小公司可以接受晚上停机迁移,但大公司是不允许停机做数据迁移的。

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

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

2.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表过热,压力过大,而其他的表没有什么压力。

总结

hash取模方案

:没有热点问题,但扩容迁移数据痛苦

range方案

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

那有没有一个方案,

即不需要迁移数据,又能解决数据热点的问题呢?

1.《分库分表 什么是数据库分库分表?》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《分库分表 什么是数据库分库分表?》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/486643.html

上一篇

c60 足球烯C60之父悄然离世:完美的对称永存世间

下一篇

成人内容 VR在成人领域受到的关注 远高于其他功能

数据库语言 SQL语句分类

数据库语言 SQL语句分类

0. 说明今天遇到一个同学分不清楚SQL所属的分类,所以我才总结下SQL语句的分类,其实基本上教科书上都会有这个。SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。SQL语句分类简图1. 数据查询语言DQL数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块...

怎样帮明星做数据 微软小冰争当社交明星背后积累数据做用户画像

  • 怎样帮明星做数据 微软小冰争当社交明星背后积累数据做用户画像
  • 怎样帮明星做数据 微软小冰争当社交明星背后积累数据做用户画像
  • 怎样帮明星做数据 微软小冰争当社交明星背后积累数据做用户画像

mysql和oracle的区别 MySQL、SQL Server、Oracle对比,你必须了解的三大数据库区别

  • mysql和oracle的区别 MySQL、SQL Server、Oracle对比,你必须了解的三大数据库区别
  • mysql和oracle的区别 MySQL、SQL Server、Oracle对比,你必须了解的三大数据库区别
  • mysql和oracle的区别 MySQL、SQL Server、Oracle对比,你必须了解的三大数据库区别
orm框架 从ORM框架,聊一聊数据库的设计

orm框架 从ORM框架,聊一聊数据库的设计

浅谈ORM只接触过EF和SqlSugar,正在做的项目用到的就是国产的SqlSugar,个人感觉写法还可以。现在的开发基本上很少还有写原生sql的了,因为ORM框架不仅能提高开发效率,而且还能支持各种数据库,避免了原生sql在更换数据库时的尴尬。但是说白了ORM框架最终也是将object转换成sql语句,不过感觉他应该不会给你优化sql吧。当遇到...

chrone 腾讯号称其浏览服务数据日活达4亿

chrone 腾讯号称其浏览服务数据日活达4亿

本站讯 4月28日消息,腾讯今日正式发布腾讯浏览服务(Tencent Browsing Service,即TBS),宣称将为合作伙伴提供整合腾讯底层技术、内容框架、广告体系以及大数据等多方面的升级浏览解决方案。据介绍,TBS目前已接入超过400款App,包括微信、QQ、京东、美丽说以及滴滴出行、墨迹天气、58、界面等。目前,腾讯浏览服务日活跃用户...

 开学主题班会活动策划方案

开学主题班会活动策划方案

为保证师生能快速恢复学习状态,激发学生的学习兴趣,并提高师生的纪律和安全意识,减少各类安全事故发生,经校行政会研究决定,将今年秋季“开学第一课”确定为“纪律安全教育课”,在各班集中进行教育。现就有关事项提出如下要求:一、活动组织组 长:xx副组长:xx、xx、xx、xx、xx成 员:xx、xx、xx、xx、xx各年级主任、各班主任。二、活动内容1...

updatesql SQL语法,更新数据UPDATE

updatesql SQL语法,更新数据UPDATE

UPDATE 语句UPDATE 语句用于更新表中已存在的数据。演示数据库...

数据库基础 SQL基础语法

数据库基础 SQL基础语法

数据库:结构化查询语言(Structured Query Language)简称SQL;数据库管理系统(Database Management System)简称DBMS;数据库管理员(Database Administration)简称DBA,功能是确保DBMS的正常高效运行;数据库分体验版(一般只安装库文件和服务)和正式版(授权使用);在正式...