水平分库分表的方法策略

分库分表介绍

在当前业务量迅猛增加的情况下,数据库经常面临性能的极致挑战。尤其是在处理大规模的数据集,例如超过千万条数据记录的情况下,SQL查询的性能将显著下降。随着数据量的增加,查询所需要扫描的数据范围变得更广,从而导致查询速度的减慢。

此外,数据规模的膨胀也会对数据库的整体性能产生影响。例如,一个数据库如果承担了过大的数据容量,可能会遭遇存储空间和I/O性能的难题。存储空间的问题表现为数据库需要更多的硬件资源来存储数据,而I/O性能的问题则是因为大量的数据需要读写,而读写操作的效率受到硬件性能的限制。

在表结构中,字段数量的增多同样会对效率产生负面影响。字段数量的增多意味着每个记录的大小增加,从而导致数据的读写速度下降。

为了解决上述问题,采纳分库分表策略被广泛认为是有效的解决方案之一。分库分表策略的核心思想是将一个大型的数据库分解为多个小型的数据库,从而将数据分散存储在不同的地方,减少单点压力,提高查询效率。

分库有垂直分库、水平分库;分表有垂直分表、水平分表。具体介绍可参考:数据库分库分表实践

数据热点介绍

数据热点也叫数据倾斜,是指在构建数据存储架构时,通常会依据某种特定标识,如ID或年份,将数据分配至各个不同的表中。然而,在实际运用中,近期数据常常在某个特定的表中高度集中。这就导致了在日常业务操作中,对这些近期数据的频繁访问,进而引发了对此特定表的高频次操作。与此同时,对其他分表的访问频率则相对较低。

尽管采用分表策略在一定程度上减少了整体的数据操作量,但这种策略无法完全解决单张表所承受的巨大访问压力。数据的总量被分散至多个表中,但在特定的时间点或特定的业务场景下,仍然会有大量的数据操作请求集中到某一张表上。这就导致了这张表的访问压力巨大,可能会引发性能瓶颈,从而影响整个系统的稳定运行。

水平分库分表的策略

这里主要先讲水平分表的策略,水平分库的策略可以在此基础上扩展。

一、按数据区间划分

以电商订单表为例,可将表的主键ID按一定数值进行分表,或按年份进行分表,具体原因如下。

电商订单表的主键ID做为分表策略的判断条件,可以提升数据处理和查询的效率。例如,可以将主键ID按照一定的数值范围进行分表,这样每个分表就可以独立进行数据查询和更新操作,从而减少大型数据库操作时的延迟。

或者,可以将订单表按照年份进行分表。这样做的好处是,当需要对某一特定年份的订单数据进行深入分析时,可以直接访问那一年份的分表,而不需要扫描整个订单表,可以显著提高数据查询的速度和效率。

主键ID按一定数值进行分表:

订单表A(每1000万分表)
ID标题其它字段
1某某某某某某某某某某某某某某某某某某某某某某
某某某某某某某某某某某某某某某某某某某某某某
10000000某某某某某某某某某某某某某某某某某某某某某某
订单表B(每1000万分表)
ID标题其它字段
10000001某某某某某某某某某某某某某某某某某某某某某某
某某某某某某某某某某某某某某某某某某某某某某
20000000某某某某某某某某某某某某某某某某某某某某某某

按年份进行分表:

订单表2023(2023年订单)
ID标题年份字段
某某某某某某某某某某2023年创建时间
某某某某某某某某某某2023年创建时间
某某某某某某某某某某2023年创建时间
订单表2024(2024年订单)
ID标题年份字段
某某某某某某某某某某2024年创建时间
某某某某某某某某某某2024年创建时间
某某某某某某某某某某2024年创建时间
数据区间划分优点

具有良好的扩展性,无需进行数据迁移。当数据量增长1千万或迎接新的年度时,仅需新增一张表即可,原有数据无需迁移。

数据区间划分缺点

会遇到所谓的“数据热点”问题。这是由于,不管是根据ID还是按照年份来划分数据,近期数据通常会集中存储在同一张表中。在日常业务操作中,对这些数据的频繁访问会导致对某张表进行高频率的操作,而对其他分表的访问则相对较少。尽管分表策略降低了整体的数据操作量,但单张表的访问压力依然很大。

在实施水平分库策略时,同样可能会出现某个数据库承担高频访问负担,而其他数据库访问量则相对较低的现象。

二、按哈希取模划分

哈希取模策略是一种数据处理方法,它通过对数据进行哈希运算后,再对其结果进行取模操作,从而将数据映射到特定的库或表中。这个取模运算通常与库的数量或表的数量相对应,因此涉及的数值是固定不变的。

以PHP代码为例说明哈希取模的逻辑

// 订单ID数据
$key = "2811285227";// 映射的数量
$numberOfBuckets = 4;// 使用crc32()函数获取字符串的哈希值
$hash = hash('crc32', $key);// 使用取模运算符将哈希值映射到特定范围
$bucketIndex = intval(abs(crc32($key)) % $numberOfBuckets);echo "Key '{$key}' 映射取模为 {$bucketIndex} .";// 当前程序运行结果为 Key '2811285227' 映射取模为 2 .

以电商订单表为例,此策略涉及将单一的订单表拆分为4个子表。在此过程中,利用订单标识(OrderID)作为哈希函数的输入,通过取模运算决定数据存储的具体位置。

例如,若运算结果为2,相应的订单数据将被写入第二张子表。这种方法确保了数据在存储时的均匀分布,进而提升了数据检索和管理的效率。

具体逻辑如下图所示:

在这里插入图片描述

哈希取模划分的优点

在处理数据时,将有效避免数据集中的热点问题。

哈希取模划分的缺点

不利于扩容,具体来说,当数据库容量需要增加时,由于模数的改变,之前存储的数据需要重新进行取模运算,并重新分配至新的数据库表中,这便涉及到了数据迁移的问题。

例如,若数据库在初始设计时采用哈希取模方式分为4个子表,而在后续扩展时,需要从4张表增加到6张表,原有的数据分布将不再合理,必须重新进行计算和分表,同时,旧有数据也需要进行迁移处理。

采用此类方法进行水平分库,同样也会遇到扩展容量的挑战。

总结

两种方法均存在一定问题,它们的优劣正好相反。具体应用时需要结合实际情况来决定,理论上而言,采用哈希取模的方式更贴近分库分表的初衷,但同时也需要评估数据迁移所带来的潜在风险。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

AOT源码解析4.4 -decoder生成预测mask并计算loss

3、生成ref_imgs的预测mask和loss 这一步在训练阶段调用 3.1 数据处理 图1,如图1所示,将enc_embs的最后一个比例的特征图和有ref_imgs相关的特征图得到的LSTT特征图相拼接作为输入 curr_enc_embs self.curr_enc_embscurr_lstt_embs self.curr_lstt_o…

了解针对基座大语言模型(类似 ChatGPT 的架构,Decoder-only)的重头预训练和微调训练

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 随着自然语言处理(NLP)技术的飞速进步,基于 Transformer 架构的大语言模型在众多任务中取得了显著成就。特别是 Decoder-only 架构,如 GPT 系列模型&…

8.7基于数学形态学的边缘检测

基本概念 数学形态学(Mathematical Morphology)是一套用于图像处理的技术,它包括膨胀(Dilation)、腐蚀(Erosion)、开运算(Opening)和闭运算(Closing&#xf…

使用电子模拟器 Wokwi 运行 ESP32 示例(Arduino IDE、VSCode、ESP32C3)

文章目录 Wokwi 简介安装客户端(Mac/Linux)创建 Token Arduino IDEVSCode 配置安装 wokwi 插件打开编译后目录 ESP32C3 示例Arduino IDE创建模拟器运行模拟器 Wokwi 简介 Wokwi 是一款在线电子模拟器。您可以使用它来模拟 Arduino、ESP32、STM32 以及许…

HTML·第3章 表格布局与表单交互

3.1 表格概述 3.1.1 表格的结构 表格是由行和列组成的二维表,而每行又由一个或多个单元格组成,用于放置数据或其他内容。表格中的单元格是行与列的交叉部分,是组成表格的最基本单元。单元格的内容是数据,也称数据单元格。数据单元…

线上环境排故思路与方法GC优化策略

前言 这是针对于我之前[博客]的一次整理,因为公司需要一些技术文档的定期整理与分享,我就整理了一下。(https://blog.csdn.net/TT_4419/article/details/141997617?spm1001.2014.3001.5501) 其实,nginx配置 服务故障转移与自动恢复也是可以…

人工智能开发实战照片智能搜索功能实现

内容提要 项目分析预备知识项目实战 一、项目分析 1、提出问题 随着人民生活水平的提高和手机照相功能的日趋完美,我们不经意中拍摄了很多值得回忆的时刻,一场说走就走的旅行途中也记录下许多令人心动的瞬间,不知不觉之中,我们…

【CSS in Depth 2 精译_040】6.3 CSS 定位技术之:相对定位(下)—— 用纯 CSS 绘制一个三角形

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结)第二章 相对单位(已完结)第三章 文档流与盒模型(已完结)第四章 Flexbox 布局(已…

RabbitMQ应用

RabbitMQ 共提供了7种⼯作模式, 进⾏消息传递 一、七种模式的概述 1、Simple(简单模式) P:生产者,就是发送消息的程序 C:消费者,就是接收消息的程序 Queue:消息队列,类似⼀个邮箱, 可以缓存消息; ⽣产者…

【微服务即时通讯系统】——brpc远程过程调用、百度开源的RPC框架、brpc的介绍、brpc的安装、brpc使用和功能测试

文章目录 brpc1. brpc的介绍1.1 rpc的介绍1.2 rpc的原理1.3 grpc和brpc 2. brpc的安装3. brpc使用3.1 brpc接口介绍 4. brpc使用测试4.1 brpc同步和异步调用 brpc 1. brpc的介绍 1.1 rpc的介绍 RPC(Remote Procedure Call)远程过程调用,是一…

使用Postman搞定各种接口token实战

现在许多项目都使用jwt来实现用户登录和数据权限,校验过用户的用户名和密码后,会向用户响应一段经过加密的token,在这段token中可能储存了数据权限等,在后期的访问中,需要携带这段token,后台解析这段token才…

Java Stream流编程入门

流式编程 stream流式编程分为 首先转化为stream中间函数的链接最后的终结函数 怎么转化为stream 单列集合 List<String> list new ArrayList<String>(); Collections.addAll(list,"1","2","3","4","5","…

【MySQL】MVCC及其实现原理

目录 1. 概念介绍 什么是MVCC 什么是当前读和快照读 MVCC的好处 2. MVCC实现原理 隐藏字段 Read View undo-log 数据可见性算法 3. RC和RR隔离级别下MVCC的差异 4. MVCC&#xff0b;Next-key-Lock 防止幻读 1. 概念介绍 什么是MVCC Multi-Version Concurrency Cont…

FGPA实验——触摸按键

本文系列都基于正点原子新起点开发板 FPGA系列 1&#xff0c;verlog基本语法&#xff08;随时更新&#xff09; 2&#xff0c;流水灯&#xff08;待定&#xff09; 3&#xff0c;FGPA实验——触摸按键 一、触摸操作原理实现 分类&#xff1a;电阻式&#xff08;不耐用&…

LeetCode - 850 矩形面积 II

题目来源 850. 矩形面积 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个轴对齐的二维数组 rectangles 。 对于 rectangle[i] [x1, y1, x2, y2]&#xff0c;其中&#xff08;x1&#xff0c;y1&#xff09;是矩形 i 左下角的坐标&#xff0c; (xi1, yi1) 是该…

通信工程学习:什么是VIM虚拟化基础设施管理器

VIM:虚拟化基础设施管理器 VIM(Virtualized Infrastructure Manager)虚拟化基础设施管理器,是一种负责管理和控制虚拟化环境中所有虚拟资源的工具和系统。以下是关于VIM虚拟化基础设施管理器的详细解释: 一、定义与功能 VIM是网络功能虚拟化(NFV)架构中…

李宏毅机器学习2023-HW10-Adversarial Attack

文章目录 TaskBaselineFGSM (Fast Gradient Sign Method (FGSM)I-FGSM(Iterative Fast Gradient Sign Method)MI-FGSM(Momentum Iterative Fast Gradient Sign Method)M-DI2-FGSM(Diverse Input Momentum Iterative Fast Gradient Sign Method) Reportfgsm attackJepg Compress…

探索5 大 Node.js 功能

目录 单线程 Node.js 工作线程【Worker Threads】 Node.js 进程 进程缺点 工作线程 注意 集群进程模块【Cluster Process Module】 内部发生了什么&#xff1f; 为什么要使用集群 注意&#xff1a; 应用场景&#xff1a; 内置 HTTP/2 支持 这个 HTTP/2 是什么&…

Windows安装Vim,并在PowerShell中直接使用vim

大家好啊&#xff0c;我是豆小匠。 这期介绍下怎么在windows的PowerShell上使用vim&#xff0c;方便在命令行里修改配置文件等。 先上效果图&#xff1a; 1、下载Vim GitHub传送门&#xff1a;https://github.com/vim/vim-win32-installer/releases 选择win-64的版本下载即可&…

VS Code使用Git Bash终端

Git Bash可以运行linux命令&#xff0c;在VS Code的终端界面&#xff0c;找到号旁边的箭头&#xff0c;就能直接切换了 当然&#xff0c;前提是安装了Git Bash&#xff0c;并且在资源管理器里&#xff0c;能鼠标右键出"Git Bash Here"