什么是分库分表?为什么要分库分表?什么时候需要分库分表?怎么样拆分?(数据库分库分表详解)

文章目录

    • 1、什么是分库分表?
      • 1.1、分库分表的概念
      • 1.2、分库分表的方式
        • 1.2.1、垂直分库
        • 1.2.2、垂直分表
        • 1.2.3、水平分库
        • 1.2.4、水平分表
    • 2、为什么要分库分表?
    • 3、什么时候需要分库分表?
    • 4、分库分表的数据路由
      • 4.1、数据路由的目的
      • 4.2、数据路由的方式
    • 5、分库分表的分布式事务
      • 5.1. 分布式事务的问题
      • 5.2. 分布式事务的解决方案
    • 6、实战案例
      • 6.1. 业务背景
      • 6.2. 分库分表方案设计
      • 6.3. 技术选型
      • 6.4. 实施步骤
      • 6.5. 效果评估
    • 7、总结

1、什么是分库分表?

1.1、分库分表的概念

分库分表的形式,主要是两种:垂直拆分和水平拆分。而拆分的粒度,一般又分为分库和分表,所以组
成的拆分策略最终如下:

  1. 分库:将一个数据库拆分成多个独立的数据库,每个数据库可以部署在不同的服务器上,从而分散数据存储和访问压力。

  2. 分表:将一个数据表拆分成多个小表,每个小表可以存储部分数据,从而减少单个表的数据量,提高查询和写入性能。

在这里插入图片描述

在这里插入图片描述

1.2、分库分表的方式

1.2.1、垂直分库

在这里插入图片描述
垂直分库:以表为依据,根据业务将不同表拆分到不同库中。

特点:

  • 每个库的表结构都不一样。
  • 每个库的数据也不一样。
  • 所有库的并集是全量数据。

原理:

  • 一个表中的字段可能具有不同的访问频率和性能需求,通过垂直分表可以将不常访问的字段分离出来,减少单个表的数据量和索引大小,提高查询性能。例如,将用户表中的基本信息字段和详细信息字段分别存储在两个不同的表中。

优点:可以提高查询性能,减少数据冗余。
缺点:表的关联查询变得复杂,需要使用多表连接或者多次查询。

1.2.2、垂直分表

在这里插入图片描述

将一个表按照字段的业务相关性拆分成多个小表,每个小表存储部分字段的数据。

特点:

  • 每个表的结构都不一样。
  • 每个表的数据也不一样,一般通过一列(主键/外键)关联。
  • 所有表的并集是全量数据。

原理:

  • 一个表中的字段可能具有不同的访问频率和性能需求,通过垂直分表可以将不常访问的字段分离出来,减少单个表的数据量和索引大小,提高查询性能。例如,将用户表中的基本信息字段和详细信息字段分别存储在两个不同的表中。

优点:可以提高查询性能,减少数据冗余。
缺点:表的关联查询变得复杂,需要使用多表连接或者多次查询。

1.2.3、水平分库

在这里插入图片描述
将一个数据库中的数据按照一定的规则分散存储到多个不同的数据库中。

特点:

  • 每个库的表结构都一样。
  • 每个库的数据都不一样。
  • 所有库的并集是全量数据。

原理:根据数据的某个特征(如用户 ID、订单 ID 等)进行哈希运算或者取模运算,将数据均匀地分布到多个数据库中。例如,根据用户 ID 进行取模运算,将用户数据分散存储到 10 个数据库中。

优点:可以提高数据库的可扩展性和性能,当数据量增加时,可以方便地添加新的数据库。
缺点:跨库查询和事务处理比较复杂,需要使用分布式查询和事务解决方案。

1.2.4、水平分表

在这里插入图片描述
以字段为依据,将一个表中的数据按照一定的规则分散存储到多个相同结构的表中。

特点:

  • 每个表的表结构都一样。
  • 每个表的数据都不一样。
  • 所有表的并集是全量数据。

原理:与水平分库类似,根据数据的某个特征进行哈希运算或者取模运算,将数据均匀地分布到多个表中。例如,根据订单创建时间进行分表,将每天的订单数据存储在一个单独的表中。

优点:可以提高表的查询和写入性能,当表的数据量增加时,可以方便地添加新的表。
缺点:表的管理变得复杂,需要使用中间件或者代码来实现数据的路由和合并。

2、为什么要分库分表?

在这里插入图片描述

随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存
储,存在以下性能瓶颈:

  1. IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。 请求数据太多,带宽
    不够,网络IO瓶颈。
  2. CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出
    现瓶颈。

为了解决上述问题,我们需要对数据库进行分库分表处理。
在这里插入图片描述
分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能
问题,从而达到提升数据库性能的目的。

在业务系统中,为了缓解磁盘IO及CPU的性能瓶颈,到底是垂直拆分,还是水平拆分;具体是分 库,还是分表,都需要根据具体的业务需求具体分析。

3、什么时候需要分库分表?

网上查了好多资料,一个项目到底什么时候需要分库分表?
这个问题应该是没有标准的答案,但是可以从用户的角度回答这个问题,凡是通过数据库操作影响用户体验,甚至体验感很差时,都需要考虑优化数据库,进行分库分表。

行内不成文的标准:

  1. 单表记录行数超过500w条
  2. 单表存储空间超过2GB
  3. .

如果你的项目中的数据库出现上述情况,就要考虑分库分表了。

4、分库分表的数据路由

4.1、数据路由的目的

确定数据在分库分表后的存储位置,使得应用程序能够正确地访问和操作数据。

4.2、数据路由的方式

数据路由方式具体内容
哈希路由根据数据的某个特征进行哈希运算,将数据映射到不同的数据库或表中。例如,根据用户 ID 进行哈希运算,将用户数据存储到不同的数据库中。
范围路由根据数据的某个特征的取值范围,将数据分配到不同的数据库或表中。例如,根据订单金额的范围,将订单数据存储到不同的表中。
列表路由根据数据的某个特征的值是否在一个预定义的列表中,将数据分配到不同的数据库或表中。例如,根据用户所在地区,将用户数据存储到不同的数据库中。

5、分库分表的分布式事务

5.1. 分布式事务的问题

在分库分表的环境下,一个事务可能涉及多个数据库或表,传统的单机事务无法满足需求,需要使用分布式事务解决方案。

5.2. 分布式事务的解决方案

阶段具体内容
两阶段提交(2PC)分为准备阶段和提交阶段,协调者向参与者发送准备请求,参与者执行事务操作并记录日志,如果所有参与者都返回准备成功,则协调者发送提交请求,参与者提交事务;否则协调者发送回滚请求,参与者回滚事务。
三阶段提交(3PC)在 2PC 的基础上增加了一个预提交阶段,减少了参与者在准备阶段的阻塞时间,提高了事务的可用性。
补偿事务(TCC)分为 Try、Confirm、Cancel 三个阶段,Try 阶段进行业务检查和资源预留,Confirm 阶段进行业务确认操作,Cancel 阶段进行业务回滚操作。TCC 需要业务系统自己实现事务的补偿逻辑,比较复杂但性能较好。

6、实战案例

以一个电商系统为例,介绍数据库分库分表的实战过程。

6.1. 业务背景

电商系统中有用户、商品、订单等模块,随着业务的发展,数据量不断增长,数据库性能出现瓶颈。

6.2. 分库分表方案设计

  1. 垂直分库
    将用户模块、商品模块、订单模块分别存储在不同的数据库中。
    在这里插入图片描述

用户数据库存储用户信息,包括用户 ID、用户名、密码、联系方式等。
商品数据库存储商品信息,包括商品 ID、商品名称、价格、库存等。
订单数据库存储订单信息,包括订单 ID、用户 ID、商品 ID、订单金额、订单状态等。

  1. 垂直分表
    在用户表中,将用户的基本信息和详细信息分别存储在两个表中。
    在这里插入图片描述

用户基本信息表存储用户 ID、用户名、密码、联系方式等。
用户详细信息表存储用户 ID、用户头像、用户简介、用户等级等。

  1. 水平分库
    根据用户 ID 进行取模运算,将用户数据分散存储到多个数据库中。
    在这里插入图片描述

假设共有 10 个数据库,用户 ID 为 100 的用户数据存储在数据库 0 中,用户 ID 为 101 的用户数据存储在数据库 1 中,以此类推。

  1. 水平分表
    根据订单创建时间进行分表,将每天的订单数据存储在一个单独的表中。
    在这里插入图片描述

例如,订单表名为 order_20240917,表示 2024 年 9 月 17 日的订单数据。

6.3. 技术选型

  1. 数据库中间件
    选择一个成熟的数据库中间件来实现分库分表的功能,如MyCat、ShardingSphere等。

  2. 数据库
    选择一个性能高、稳定性好的数据库,如 MySQL、PostgreSQL 等。

6.4. 实施步骤

  1. 安装和配置数据库中间件
    根据中间件的文档进行安装和配置,设置分库分表的规则和参数。

  2. 改造应用程序
    修改应用程序的数据库连接配置,使其连接到数据库中间件。同时,修改应用程序的 SQL 语句,使其适应分库分表的环境。例如,在查询用户信息时,需要根据用户 ID 确定查询的数据库和表。

  3. 数据迁移
    将现有数据库中的数据迁移到分库分表后的数据库中。可以使用数据库中间件提供的数据迁移工具,或者编写自己的数据迁移脚本。

  4. 测试和优化
    在实施分库分表后,进行充分的测试,包括功能测试、性能测试、压力测试等。根据测试结果进行优化,调整分库分表的规则和参数,提高系统的性能和稳定性。

6.5. 效果评估

  1. 性能提升
    通过分库分表,数据库的查询和写入性能得到了显著提升。查询响应时间缩短,写入延迟减少,系统能够更好地应对高并发访问。

  2. 可扩展性增强
    当数据量增加时,可以方便地添加新的数据库或表,提高了系统的可扩展性。

  3. 可用性提高
    分库分表后,即使某个数据库或表出现故障,也不会影响整个系统的运行,提高了系统的可用性。

7、总结

数据库分库分表是一种解决大规模数据和高并发访问的有效技术方案。通过垂直分库、垂直分表、水平分库、水平分表等方式,可以将数据分散存储到多个数据库或表中,提高数据库的性能、可扩展性和可用性。在实施分库分表时,需要根据业务需求和数据特点进行合理的方案设计,选择合适的技术选型,并进行充分的测试和优化。

在这里插入图片描述


人生从来没有真正的绝境。只要一个人的心中还怀着一粒信念的种子,那么总有一天,他就能走出困境,让生命重新开花结果。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455034.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

class 9: vue.js 3 组件化基础(2)父子组件间通信

目录 父子组件之间的相互通信父组件传递数据给子组件Prop为字符串类型的数组Prop为对象类型 子组件传递数据给父组件 父子组件之间的相互通信 开发过程中,我们通常会将一个页面拆分成多个组件,然后将这些组件通过组合或者嵌套的方式构建页面。组件的嵌套…

2024开放原子开源生态大会 | 麒麟信安携手openEuler共建开源生态,共塑产业未来

9月25日-27日,由开放原子开源基金会主办的2024开放原子开源生态大会在北京开幕,大会以“开源赋能产业,生态共筑未来”为主题。工业和信息化部党组书记、部长金壮龙,北京市委副书记、市长殷勇,工业和信息化部总经济师、…

汇川机器人与PLC通信-ModbusTCP超详细案例

#SCARA机器人与H5UPLC通过ModbusTCP通信,HMI界面手动操作# 应用背景: 本项目案例部分软件界面已被更新,如机器人示教软件旧版本S01.19R03。但通信的原理基本一致,废话少说,我们直接上图。 一、PLC端配置 1.添加ROB通讯表(自定义),变量表内容包括ROB系统变量,IN区和…

Cadence元件A属性和B属性相互覆盖

最近在使用第三方插件集成到Cadence,协助导出BOM到平台上,方便对BOM进行管理和修改,结果因为属性A和属性B不相同,导致导出的BOM错误。如下图: ​​ 本来我们需要导出Q12,结果给我们导出了Q13,或者反之&…

基于opencv的人脸闭眼识别疲劳监测

1. 项目简介 本项目旨在实现基于眼部特征的眨眼检测,通过监测眼睛开闭状态来计算眨眼次数,从而应用于疲劳监测、注意力检测等场景。使用了面部特征点检测算法,以及眼部特征比率(EAR, Eye Aspect Ratio)来判断眼睛的闭…

Python 实现 excel 数据过滤

一、场景分析 假设有如下一份 excel 数据 shop.xlsx, 写一段 python 程序,实现对于车牌的分组数据过滤。 并以车牌为文件名,把店名输出到 车牌.txt 文件中。 比如 闽A.txt 文件内容为: 小林书店福州店1 小林书店福州店2 二、依赖安装 程序依…

【C++】拆分详解 - 模板

文章目录 一、泛型编程二、函数模板1. 概念2. 语法3. 函数模板的原理4. 函数模板的实例化5. 模板参数的匹配原则 三、类模板1. 语法2. 实例化 四、模板的特化1. 概念2. 函数模板特化3. 类模板特化3.1 全特化3.2 偏特化 / 半特化3.3 应用示例 4. 小结 五、模板的分离编译1. 分离…

Java:抽象类和接口

一.抽象类 1.抽象类概念和语法 ⨀概念: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 ⨀语…

JMeter使用不同方式传递接口参数

1、使用 HTTP 请求中的参数: 在 JMeter 的测试计划中,添加一个 "HTTP 请求" 元件。 在 "HTTP 请求" 元件的参数化选项中,可以添加参数的名称和值。可以手动输入参数,也可以使用变量来传递参数值。 如果要使…

Golang | Leetcode Golang题解之第497题非重叠矩形中的随机点

题目: 题解: type Solution struct {rects [][]intsum []int }func Constructor(rects [][]int) Solution {sum : make([]int, len(rects)1)for i, r : range rects {a, b, x, y : r[0], r[1], r[2], r[3]sum[i1] sum[i] (x-a1)*(y-b1)}return Sol…

自定义多级联动选择器指南(uni-app)

多端支持:可以运行在H5、APP、微信小程序还是支付宝小程序,都可以轻松使用改组件。自定义配置:您可以根据需要配置选择器的级数,使其适应不同的数据结构和用例。无限级联:此组件支持无限级联选择,使您能够创…

最好的ppt模板网站是哪个?做PPT不可错过的18个网站!

现在有很多PPT模板网站,但真正免费且高质量的不多,今天我就分享主流的国内外PPT模板下载网站,并且会详细分析这些网站的优缺点,这些网站都是基于个人实际使用经验的,免费站点会特别标注,让你可以放心下载&a…

信息安全工程师(64)其他恶意代码分析与防护

前言 恶意代码是指那些能够损害系统用户和系统所有者利益的软件,是故意在计算机系统上执行恶意任务的恶意代码的集合。 一、恶意代码分析 病毒(Virus) 定义:病毒是一种人为制造的、能够进行自我复制的、具有对计算机资源的破坏作用…

国家信息安全水平考试(NISP一级)最新题库-第十七章

目录 另外免费为大家准备了刷题小程序和docx文档,有需要的可以私信获取 1 受到了ARP欺骗的计算机,发出的数据包,     地址是错误的() A.源IP;B.目的IP;C.源MAC;D.目的MAC 正…

rust入门基础总结

文章目录 前言1、输出格式规范一、占位符相关(一){}与{:?} 二、参数替换方式(一)位置参数(二)具名参数 三、格式化参数(一)宽度(二)对齐(三&…

基于K8S的StatefulSet部署mysql主从

StatefulSet特性 StatefulSet的网络状态 拓扑状态:应用的多个实例必须按照某种顺序启动,并且必须成组存在,例如一个应用中必须存在一个A Pod和两个B Pod,且A Pod必须先于B Pod启动的场景 存储状态:应用存在多个实例&…

Golang | Leetcode Golang题解之第500题键盘行

题目: 题解: func findWords(words []string) (ans []string) {const rowIdx "12210111011122000010020202" next:for _, word : range words {idx : rowIdx[unicode.ToLower(rune(word[0]))-a]for _, ch : range word[1:] {if rowIdx[unico…

【Redis】数据结构(下)

文章目录 QuickList概念QuickList结构QuickList的特点控制ZipList的大小对节点的ZipList进行压缩 总结 SkipList概念源码中结构分析总结 QuickList 概念 问题1:ZipList虽然节省内存,但是申请的内存必须是连续空间,如果内存占用过多,申请内存效率低,怎么办? 为了缓解这个问题,…

可编辑38页PPT | 柔性制造企业数字化转型与智能工厂建设方案

荐言分享:在数字化技术快速发展的今天,传统的大规模生产模式已难以满足市场对个性化、定制化产品的需求。柔性制造以其灵活多变、快速响应的特点,成为制造业转型升级的关键。通过数字化转型与智能工厂建设,企业可以构建高效、灵活…

Llama Tutor:开源 AI 个性化学习平台,根据主题自动制定学习计划

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号&#xff…