什么是分库分表?它有哪些实现类型?

news2025/1/11 11:55:45

假如你正在使用关系型数据库开发一款健康类系统。业务发展很好,系统有很多活跃的新老用户,这些用户会和平台的医生团队进行交互,每天可能会生成数万甚至数十万级别的业务数据。这样的话,随着数据量越来越大,系统中的某些数据表的访问就会出现瓶颈,最典型的就是用于保存用户和医生日常交流数据的健康咨询表:


虽然从理论上讲,像健康咨询表这样位于关系型数据库中的单个表可以存储的数据能够达到亿条级别,但这时候访问性能就会变得很差。业界普遍认为,诸如MySQL这样的主流数据库,单表容量在千万以下是一项最佳实践,一旦超过这个量级,就需要考虑采用其他方案。那么问题就来了,我们如何应对日益增长的数据量呢?有没有成熟的解决方案呢?

答案是肯定的,这就是我们接下来要引入的分库分表技术。所谓分库分表,你可以简单理解为:将原来独立的数据库拆分成若干数据库,将原来数据量大的单个表拆分成若干个数据表,使得单一数据库、单一数据表的数据量变得足够小,从而达到提升数据库性能的效果。有时候,我们也把分库分表统称为是一种数据分片技术,因为从概念上讲,无论是分库还是分表,都是把一定数据划分成不同的数据片,并存储在不同的目标对象中。

讲到这里,你实际上已经明确了一点,无论是分库还是分表,本质上体现的都是一种对现有数据进行拆分的思想,而这种拆分思想又有两种不同的实现策略,即垂直拆分和水平拆分:


相比水平拆分,垂直拆分相对比较容易理解和实现,所以我们先来讨论这种拆分策略。在健康类系统中,用户在查看健康咨询表数据时,位于健康咨询首页的诸如咨询编号、医生编号等基础数据的访问频率显然要比咨询详情等明细数据更高,因为用户总是先定位到基础数据,然后再选择某一个咨询记录并查看明细。基于这两种数据的不同访问特性,我们可以把健康咨询这种单表进行拆分,根据访问频次来把咨询数据分别放在两张表中,如下所示:


由此可以,垂直分表的处理方式就是将一个表按照字段分成多张表,每个表存储其中一部分字段。在实现上,我们通常会把诸如详情类的低热度数据放在一张独立的表中。

通过垂直分表能得到来一定程度的性能提升,但毕竟拆分后的数据仍然都是位于同一个数据库实例中,每个表还是会竞争同一台数据库服务器中的CPU、内存、网络IO等资源,性能的提升限制很多。基于这一考虑,在有了垂直分表之后,我们就可以进一步引入垂直分库。

让我们回到案例,针对前面介绍的场景,分表之后的健康咨询表同样还是跟健康用户表等其他数据表存放在同一台服务器中。基于垂直分库思想,这时候,我们就可以把健康咨询相关的数据表单独拆分出来,放在一个独立的数据库中,如下图所示:


上图的效果就是垂直分库。从定义上讲,垂直分库是指将表进行分类,然后分布到不同的数据库实例上。显然,在高并发场景下,垂直分库能够一定程度的提升IO访问效率和数据库连接数,并降低单机硬件资源的瓶颈。

从前面的分析中我们不难明白,垂直拆分尽管实现起来比较简单,但并不能解决单表数据量过大这一核心问题。所以,现实中我们往往需要在垂直拆分的基础上再添加水平拆分机制。例如,我们可以对健康咨询库中的健康咨询表数据按照用户编号进行取模,然后分别存储在不同的数据库中,这就是水平分库的常见做法,如下所示:


可以看到,水平分库是把同一个表的数据按一定规则拆分到不同的数据库实例中。如果采用了上图中的水平分库方案,系统复杂度就会比垂直分库要高很多,因为我们就不得不面临一个问题,即如何知道目标数据位于哪一个数据库中呢?这就需要引入路由规则的概念。像上图中根据“用户编号以3取模”就是一条路由规则。

那么,我们如何来设计并实现这些路由规则呢?业界也存在一系列路由算法,常见的包括范围限定算法、预定义算法以及前面介绍的取模算法:


参照水平分库的思路,我们也可以对用户库中的用户表进行水平拆分,效果如下所示。也就是说,水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中。


到现在为止,我们已经把分库分表的基本概念梳理了一遍。你会发现这些概念理解起来并不是很复杂,但如何实现这些概念呢?你可以自己从零开始打造一套分库分表的实现工具,但显然并没有看上去那么简单,而我也不推荐你重复造轮子。幸好,目前业界已经存在一批分库分表的实现方案,主要分成客户端类分库分表和代理服务类分库分表两大类,接下去我也来介绍一下。


所谓客户端类分库分表,相当于在使用数据库的客户端应用程序中就完成了数据分片的实现。针对这种方案,因为没有独立的服务器组件,所以结构上比较简单。在Java世界中,通常做法会把客户端分片相关的处理逻辑单独抽离出来封装成一个独立的工具包,从而避免业务代码和分库分表逻辑过于耦合。而这个独立工具包的构建方法通常就是覆写现有的JDBC规范,这样,业务开发人员还是使用与JDBC规范完全兼容的一套API来操作数据库,但这套API的背后却自动完成了分库分表操作,效果如下:


这种解决方案的优势在于分库分表操作对于业务而言是完全透明的。这样,普通业务开发人员只需要理解JDBC规范就可以自行实现分库分表,开发难度以及代码维护成本得到降低。

另一方面,代理服务类分库分表的解决方案也比较明确,顾名思义,就是采用了代理机制,也就是说在应用层和数据库层之间添加一个代理层。有了代理层之后,对内我们就可以把分片规则集中维护在这个代理层中,对外则同样提供与JDBC兼容的API给到应用层,其效果如下所示:


显然,代理服务器分库分表方案的优点在于解放了业务开发人员对分库分表规则的管理工作,而缺点就是添加了一层代理层,一方面会因为新增了一层网络传输而对性能产生一定的影响;另一方面,通常也需要专门的运维人员来确保代理服务器本身的稳定性。

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

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

相关文章

如何选择易用性高的项目管理软件?

随着项目管理在各行各业的广泛应用,选择一款易用性高的项目管理软件变得越来越重要。易用性高的软件可以帮助企业提高工作效率,降低管理成本,同时还能提升团队之间的协作能力。那么,如何选择一款易用性高的项目管理软件呢&#xf…

C++ Linux调试(无IDE)

跨平台IDE编译调试C很方便,如QTCreate 、VSCode、Eclipse等,但是如果只能使用Shell控制台呢,gdb调试的优势就很明显了,在没有IDE的情况下,这个方式最有效。因为上手不是很难,特此整理 参考链接 目录 1、G…

边缘网关在实际应用中的价值与挑战-天拓四方

随着物联网、大数据和人工智能等技术的快速发展,边缘计算逐渐崭露头角,成为推动数字化转型的关键力量。而边缘网关,作为边缘计算的核心组成部分,其重要性不言而喻。本文将以某智能制造企业为例,结合数据分析&#xff0…

MySQL高级-MVCC- readview介绍

文章目录 1、介绍2、ReadView中包含了四个核心字段:3、版本链数据的访问规则:4、不同的隔离级别,生成ReadView的时机不同: 1、介绍 ReadView(读视图)是 快照读 SQL执行时MVCC提取数据的依据,记录…

微信小程序订单发货管理接入

订单发货管理接入指引:https://mp.weixin.qq.com/cgi-bin/announce?token1148555877&actiongetannouncement&key11671435333v04b2&version1&langzh_CN&platform2https://mp.weixin.qq.com/cgi-bin/announce?token1148555877&actiongetann…

Redis基础教程(十):HyperLogLog

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

掌握IP代理API提取技巧,让你的网络操作更高效!

IP代理在现代网络中扮演着越来越重要的角色。今天,我们将深入探讨IP代理的API提取知识,帮助大家更好地理解和应用这一技术。 IP代理API是什么? IP代理API是提供IP代理服务的接口,允许开发者通过编程方式自动获取和管理代理IP。通…

土壤养分检测仪——助力农田监测

在现代化的农业生产中,精准施肥、科学种植已成为提升作物产量与品质的关键。为了实现这一目标,土壤养分检测仪成为了农田科技的得力助手。这款仪器不仅配备了成品药剂和检测器材,还能在现场进行快速测定,广泛应用于农田土壤养分的…

干式电抗器的工作原理是什么

干式电抗器是电力系统中常用的无功补偿设备,主要用于调节电网的电压、提高功率因数、限制短路电流等。它的工作原理主要是通过在电路中引入一个与负载电流相反的磁场,从而产生一个与负载电流相抵消的电抗力,达到调节电压和功率因数的目的。 干…

昇思25天学习打卡营第12天|linchenfengxue

DCGAN生成漫画头像 通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。 GAN基础原理 生成式对抗网络(Generative Adversarial Networks,GAN)是一种生成式机器学习模型,是近年来复杂分布上无监督学习最具前景的…

全面详解菲律宾slots游戏本土网盟广告CPI流量效果分析

全面详解菲律宾slots游戏本土网盟广告CPI流量效果分析 一、引言 随着互联网的普及和移动设备的广泛应用,网络游戏行业迅速崛起,成为全球娱乐市场的一大热门。菲律宾作为东南亚地区的重要国家,其网络游戏市场也呈现出蓬勃的发展势头。在这样的…

免费分享:2022年全国地铁站点数据(附下载方法)

数据简介 2022年全国地铁站点数据不仅反应我国城市交通网络的日益完善,也为城市规划、公共交通优化、商业布局、应急响应及智慧城市建设提供了宝贵的数据支持与参考,助力城市发展与居民生活质量的全面提升。 数据属性 数据名称:全国地铁站点…

iPhone苹果手机怎么取消腾讯视频VIP会员自动续费?

腾讯视频会员分为VIP(同时在线设备5台、同时播放设备2台;)和SVIP(同时在线设备8台、同时播放设备3台;),在iPhone苹果手机上开通腾讯视频连续包月、包季、包年后,需要手动取消才能关闭…

全网最全最细的jmeter接口测试教程,建议收藏

在日常工作中,尤其是做接口测试时,我们最经常用到的两个工具,就是Jmeter和postman。今天,我们主要是讲一讲Jmeter在接口测试这一块的一些方式方法。内容比较多,大家可以收藏一下,以后慢慢学。 1&#xff0…

【QT】概述|对象树模型|两种控件模式|信号和槽|lambda

目录 什么是QT 特点 QT程序 main函数 QT按钮 纯代码模式 图形化模式 对象树模型 信号和槽 连接与断开 自动连接 断开连接 信号的发射 lambda表达式 基本语法 捕获列表 Lambda表达式用于信号与槽的连接 例如 什么是QT Qt是一个跨平台的C图形用户界面应用…

AJAX的概述 ,同步和异步的区别 ,AJAX 的交互模型和传统交互模型的区别

一. AJAX的概述 1.1 什么是ajax 同步: 异步: 1.AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 ​ 说明:异步:就是不同步。例如我们向后台发送请求,同步的方式是后台必…

南京·2024江苏眼睛健康产业展览会观众邀请·徐州站

6月29日,南京2024全国眼睛健康产业博览会暨眼科医学大会,组委会一行六人来到国家级历史文化名城-徐州,开启了南京全国眼博会江苏省十三个城市线下观众邀请的徐州站工作。徐州,作为华东重要门户城市,华东地区重要的科教…

牛客小白月赛97

A.三角形 判断等边三角形&#xff0c;题不难&#xff0c;代码如下&#xff1a; #include <iostream>using namespace std;int a[110];int main() {int n;cin >> n;int x;int mx 0;for(int i 1; i < n; i){cin >> x;mx max(mx, x);a[x];}for(int i 1…

layui-页面布局

1.布局容器 分为固定和完整宽度 class layui-container 是固定宽度 layui-fluid是完整宽度

【Python】Python的安装与环境搭建

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言Python下载环境配置测试环境变量是否配置成功配置环境变量 运行Python交互式解释器&#xff1a;命令行脚本集成开发环境&#xff08;IDE&#xff1a;Integrated Development E…