数据库垂直拆分 水平拆分

一文读懂数据库/数据库表的水平垂直拆分 数据库、数据库表拆分,解决数据库性能瓶颈 阅读详情

当我们使用读写分离、缓存后,数据库的压力还是很大的时候,这就需要使用到数据库拆分了。

        

        数据库拆分简单来说,就是指通过某种特定的条件,按照某个维度,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面以达到分散单库(主机)负载的效果。 

 

        切分模式: 垂直(纵向)拆分、水平拆分。

 

垂直拆分

 

        专库专用

 

        一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图:

        

优点:

        1. 拆分后业务清晰,拆分规则明确。

        2. 系统之间整合或扩展容易。

        3. 数据维护简单。

 

缺点:

        1. 部分业务表无法join,只能通过接口方式解决,提高了系统复杂度。

        2. 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。

        3. 事务处理复杂。

 

水平拆分

 

        垂直拆分后遇到单机瓶颈,可以使用水平拆分。相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中。

 

        相对于垂直拆分,水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中 的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,主要有分表,分库两种模式,如图:

                

 

        

优点:

        1. 不存在单库大数据,高并发的性能瓶颈。

        2. 对应用透明,应用端改造较少。     

        3. 按照合理拆分规则拆分,join操作基本避免跨库。

        4. 提高了系统的稳定性跟负载能力。

 

缺点:

        1. 拆分规则难以抽象。

        2. 分片事务一致性难以解决。

        3. 数据多次扩展难度跟维护量极大。

        4. 跨库join性能较差。

 

拆分的处理难点

 

两张方式共同缺点

 

        1. 引入分布式事务的问题。

        2. 跨节点Join 的问题。

        3. 跨节点合并排序分页问题。

 

针对数据源管理,目前主要有两种思路:

 

        A. 客户端模式,在每个应用程序模块中配置管理自己需要的一个(或者多个)数据源,直接访问各个 数据库,在模块内完成数据的整合。 

        优点:相对简单,无性能损耗。   

        缺点:不够通用,数据库连接的处理复杂,对业务不够透明,处理复杂。

 

       B. 通过中间代理层来统一管理所有的数据源,后端数据库集群对前端应用程序透明;   

        优点:通用,对应用透明,改造少。   

        缺点:实现难度大,有二次转发性能损失。

 

拆分原则

    

        1. 尽量不拆分,架构是进化而来,不是一蹴而就。(SOA)

        2. 最大可能的找到最合适的切分维度。

        3. 由于数据库中间件对数据Join 实现的优劣难以把握,而且实现高性能难度极大,业务读取  尽量少使用多表Join -尽量通过数据冗余,分组避免数据垮库多表join。

        4. 尽量避免分布式事务。

        5. 单表拆分到数据1000万以内。

 

切分方案

    

        范围、枚举、时间、取模、哈希、指定等

 

案例分析

 

场景一

建立一个历史his系统,将公司的一些历史个人游戏数据保存到这个his系统中,主要是写入,还有部分查询,读写比约为1:4;由于是所有数据的历史存取,所以并发要求比较高; 

 

分析:

历史数据

写多都少

越近日期查询越频繁?

什么业务数据?用户游戏数据

有没有大规模分析查询?

数据量多大?

保留多久?

机器资源有多少?

 

方案1:按照日期每月一个分片

带来的问题:1.数据热点问题(压力不均匀)

 

方案2:按照用户取模,  --by Jerome 就这个比较合适了

带来的问题:后续扩容困难

 

方案3:按用户ID范围分片(1-1000万=分片1,xxx)

带来的问题:用户活跃度无法掌握,可能存在热点问题

 

场景二

建立一个商城订单系统,保存用户订单信息。

 

分析:

电商系统

一号店或京东类?淘宝或天猫?

实时性要求高

存在瞬时压力

基本不存在大规模分析

数据规模?

机器资源有多少?

维度?商品?用户?商户?

 

方案1:按照用户取模,

带来的问题:后续扩容困难

 

方案2:按用户ID范围分片(1-1000万=分片1,xxx)

带来的问题:用户活跃度无法掌握,可能存在热点问题

 

方案3:按省份地区或者商户取模

数据分配不一定均匀

 

场景3

上海公积金,养老金,社保系统

 

分析:

社保系统

实时性要求不高

不存在瞬时压力

大规模分析?

数据规模大

数据重要不可丢失

偏于查询?

 

方案1:按照用户取模,

带来的问题:后续扩容困难

 

方案2:按用户ID范围分片(1-1000万=分片1,xxx)

带来的问题:用户活跃度无法掌握,可能存在热点问题

 

方案3:按省份区县地区枚举

数据分配不一定均匀

 

 

 

        数据库问题解决后,应用面对的新挑战就是拆分应用等

如何进行数据库的水平拆分和垂直拆分? 数据库拆分是将一个大型数据库按照某种规则分解为多个较小、更易管理的数据库的过程。这种技术旨在解决单机数据库在性能、存储和可用性方面的限制。DBoriginalfDB1DB2DBnDBoriginal​fDB1​DB2​DBn​其中fff代表拆分函数,决定了数据如何分布到各个子数据库中。垂直拆分是按照业务功能或数据表的关联性,将不同的表拆分到不同的数据库中。这种拆分方式基于业务维度,每个数据库包含完整的业务子集。设原数据库DBDBDB包含表集合TT。 阅读详情

相关推荐

深度解析数据库垂直与水平拆分:原则详解

通过详细探讨数据库拆分的原则,包括垂直拆分原则、水平拆分原则、性能优化与监控等方面,读者将能够全面了解数据库拆分的实施细节。通过本文,我们将为读者提供一个清晰的指南,使其能够更好地应用这些原则,解决实际项目中可能遇到的挑战,并充分利用数据库拆分带来的好处。随着业务规模的扩大和数据量的增加,传统的单一数据库模式逐渐显得力不从心,因此,数据库拆分成为解决数据管理问题的重要手段之一。在本文中,我们深入探讨了数据库垂直与水平拆分的原则,以解决不断增长的业务需求对数据库性能和扩展性的挑战。

fudaihb的博客 2549

数据库的垂直拆分和水平拆分

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34406086的博客 205

MySQL专题:数据库垂直、水平拆分

目录 垂直拆分 优点 缺点 水平拆分 总结 数据拆分前其实是要首先做准备工作的,然后才是开始数据拆分,我先讲拆分前需要做的事情: 第一步:采用分布式缓存redis、memcached等降低对数据库的读操作。 第二步:如果缓存使用过后,数据库访问量还是非常大,可以考虑数据库读、写分离原则。 第三步:当我们使用读写分离、缓存后,数据库的压力还是很大的时候,这就需要使用到数据库拆分了。 数据库拆分原则:就是指通过某种特定的条件,按照某个维度,将我们存放在同一个数据库中的数据分散存放...

NIO4444 620

垂直拆分和水平拆分

垂直拆分就是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程中是很常见的。当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在一起,当网站不断丰富和壮大的时候,也会变成多个子系统来支撑,这时就有按模块和功能把表划分出来的需求。其实,相对于垂直切分更进一步的是服务化改造,说得简单就是要把原来强耦合的系统拆分成多个弱耦合的服务

蘑菇蘑菇不会开花的专栏 1万+

Python+MySQL分表分库实战

Python+MySQL分表分库实战,适合对MySQL 分库分表感兴趣的读者。

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

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

数据库水平拆分和垂直拆分区别

[size=medium][size=x-small][color=blue]数据库水平拆分和垂直拆分区别 案例: 简单购物系统暂设涉及如下表: 1.产品表(数据量10w,稳定) 2.订单表(数据量200w,且有增长趋势) 3.用户表 (数据量100w,且有增长趋势) 以mysql为例讲述下水平拆分和垂直拆分,mysql能容忍的数量级在百万静态数据可以到千万...

jormen_chen的专栏 514

利用makehumancommunity导入人体模型到COMSOL里(需要solidwork)

#makehumancommunity #solidwork #COMSOL

qq_41227634的博客 2157

数据库拆分(垂直、水平)

垂直拆分 垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表,垂直拆分更多时候就应该在数据表设计之初就执行的步骤,然后查询的时候用jion关键起来即可。垂直拆分解决表与表之间的io竞争。 通常我们按以下原则进行垂直拆分: 把不常用的字段单独放在一张表; 把text,blob等大字段拆分出来放在附表中; 经常组合查询的列放在一张表中; 优点: 1、拆分后业务清晰,拆分规则明确。 2、系统之间整合或扩展容易。 3、数据维护简单。 缺点: 1、部分业务表无法join,只能通过接口.

极客 2118

使用OpenTK展示3D点云图像(C#)

图中存在一个空的点,可通过阈值分割过滤掉,然后如何保证某个点必然存在后面两个和它构成三角形的点,用一个2x2的结构元腐蚀阈值分割出的区域,得到剩下所有的点必然每个点可以构成三角形,这种得到三角形的算法效率会非常高。然后还有光照,无光照和有光照效果差异很大,处理光照核心在于得到每个点的法向量,用上面的三角形的两条边构成的向量叉乘,及得到这个点的法向量,输入给着色器处理得到光照的渲染效果,如下面两张图对比。我们需要把点连成面,有很多算法可以实现,但我拿到的图为一张tif格式16位的深度图,如下图。

海盗Isaac 2283

玩转ubuntu18 --机器视觉方面(yolo算法识别及摄像头和cmake问题解决)

玩转ubuntu18 --机器视觉方面(yolo v3算法识别) 1.YOLO的简介 工作原理 先前的检测系统重新调整分类器或本地化器以执行检测。他们将模型应用于多个位置和比例尺的图像。图像的高分区域被视为检测。 我们使用完全不同的方法。我们将单个神经网络应用于整个图像。该网络将图像划分为区域,并预测每个区域的边界框和概率。这些边界框按预测概率加权。 我们的模型比基于分类器的系统具有几个优势。它在测试时间查看整个图像,因此其预测由图像中的全球上下文提供信息。它还通过单一网络评估进行预测,这与R-CNN等系统

qq_53951823的博客 1556

数据库垂直拆分和水平拆分

特性垂直拆分 (Vertical Sharding)水平拆分 (Horizontal Sharding)拆分依据列 (Column) / 业务功能 (Business Function)行 (Row) / 数据记录 (Data Record)目标减少单表宽度、分散热点、业务解耦、优化资源解决海量数据存储、分散读写负载 (TPS/QPS)、并行处理影响范围表结构改变 / 数据库实例分离表结构不变,数据分布到多个相同结构的表/实例优点提升热点查询性能、业务清晰、资源隔离、易于优化大字段。

翔云 1301

Python爬虫教程:抓取电商网站评论(以淘宝和京东为例)

通过本文的介绍,我们学会了如何使用Python编写爬虫,抓取淘宝和京东等电商平台的商品评论数据。我们介绍了如何使用电商平台提供的开放API以及如何通过模拟浏览器来抓取动态加载的数据。此外,我们还讨论了如何应对反爬虫技术,如何存储抓取的数据等。爬取电商平台的数据是一个强大的工具,能够为市场分析、消费者行为研究、产品优化等领域提供有力的支持。然而,在使用爬虫技术时,我们必须遵循法律法规,尊重平台的隐私政策,避免滥用数据。

2201_76125261的博客 1737

Mysql数据库垂直拆分与水平拆分

当我们使用读写分离、缓存后,数据库的压力还是很大的时候,这就需要使用到数据库拆分了。 数据库拆分简单来说,就是指通过某种特定的条件,按照某个维度,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面以达到分散单库(主机)负载的效果。 切分模式: 垂直(纵向)拆分、水平拆分。 垂直拆分 专库专用 一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到...

qq_36350266的博客 2977

2026年江苏省职业院校技能大赛高职组“软件测试”赛项智能体辅助测试参考答案

2026年江苏省职业院校技能大赛高职组“软件测试”赛项智能体辅助测试参考答案

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 1319

Spring AI Alibaba 项目源码学习(九)-其他继承BaseAgent

本文分析了Spring AI Alibaba Agent Framework中的A2aRemoteAgent实现,主要特点包括: 实现了Agent间的远程调用能力,支持分布式部署 核心组件包括AgentCard封装元数据、A2aNodeActionWithConfig处理调用逻辑、AgentCardProvider提供卡片管理 支持流式调用和状态共享机制 采用Builder模式构建Agent实例 通过指令传递实现Agent间通信 关键流程包括状态提取、请求构建、远程调用和状态更新四个步骤,形成Agent

819

mysql数据库的水平拆分与垂直拆分

端时间在面试,发现很多面试官或者面试都把数据的水平拆分合垂直拆分给搞混了,今天特意写了一篇博客来说说水平拆分和垂直拆分希望对程序猿们有所帮助。 数据库水平与垂直拆分: 垂直(纵向)拆分:是指按功能模块拆分,比如分为订单库、商品库、用户库…这种方式多个数据库之间的表结构不同。 水平(横向)拆分:将同一个表的数据进行分块保存到不同的数据库中,这些数据库中的表结构完全相同。 数据表的水平与垂直拆分: 垂...

ac20171688的博客 181

YOLOv10改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

如何寻找创新点?为什么要使用这个模块?如何才能提升模型的精度?这是贯穿我们研究始终的问题。创新点在这个专栏中我已经整理好了,这已经省去了大部分时间,但是当我们使用这些新的模块去优化已有的模型,如何才能提升模型的精度,才是我们要达到的最终目标。当然我们可以使用传统的A+B+C的方法去堆积模块,然后是进行大量的实验去排列组合以实现最终的精度提升,这无可厚非。

Limiiiing的博客 1万+

如何对数据库如何进行垂直拆分或水平拆分

那么将这张表拆成两张表,把那些经常命中的字段抽成一张表。不被命中的、冷门的字段抽成另外一张表。表1是经常被抽中的。当我们在访问这个业务的时候,表1经常会被命中,意味着其有缓存。命中的越多的话,下次就直接到缓存中了。当一个名为DB的数据库表中的数据已经超过1000万了。再建个数据库DB2,还是放订单表。假设现在有张表,这张表很多的字段,有20个字段。这张表中前面的5个字段他是用的非常多的,经常被查询或者修改等等等等。

qq_46130027的博客 267

Qt入门教程【高级控件篇】QModelIndex索引

QModelIndex索引

小鱼酱的博客 4465

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数据库表的垂直拆分/水平拆分

所谓的垂直拆分,就是把原来一个有很多列的表拆分成多个表,这解决了表的宽度问题.水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放如果单表的数据量达到上亿条,那么这时候我们尽管加了完美的索引,查询效率低,写入的效率也相应的降低。优点:1. 不存在单库大数据,高并发的性能瓶颈。2. 对应用透明,应用端改造较少。3. 按照合理拆分规则拆分,join操作基本避免跨库。4. 提高了系统的稳定性跟负载能力。缺点:1. 拆分规则难以抽象。

qq_43635902的博客 2263

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数据库和数据库表的水平拆分和垂直拆分

数据库垂直拆分(按照功能模块拆分) 数据库水平拆分(根据某种规则划分,比如对id取余) 数据库表的垂直拆分 数据库表的水平拆分 数据拆分前其实是要首先做准备工作的,然后才是开始数据拆分 第一步:采用分布式缓存redis、memcached等降低对数据库的读操作。 第二步:如果缓存使用过后,数据库访问量还是非常大,可以考虑数据库读、写分离原则。 第三步:当我们使用读写分离、缓存后,数据库的...

Prodigal 5156

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数据库垂直拆分与水平拆分

数据库垂直拆分与水平拆分 当数据库的数据量非常大时,水平拆分和垂直拆分时两种常见的降低数据库大小,提升性能的方法 假设有用户表: user{ uid bigint, name varchar(16), pass varchar(16), age int, sex tinyint, flag tinyint, sign varchar(64), intro varchar(25...

Dave的博客 848
上一篇: JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
下一篇: Redis雪崩效应以及解决方案
八点二十四分
博客等级 码龄10年 29粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值