分库分表之优缺点分析

大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注
实战代码系列最新文章😉C++实现图书管理系统(Qt C++ GUI界面版)
SpringBoot实战系列🐷【SpringBoot实战系列】Sharding-Jdbc实现分库分表到分布式ID生成器Snowflake自定义wrokId实战
环境搭建大集合环境搭建大集合(持续更新)

前情摘要:
1、数据库性能优化

本文章目录

  • 一、分库分表:突破数据库性能瓶颈的原因
    • 一、数据库连接数瓶颈问题
    • 二、单表海量数据查询性能问题
    • 三、单台数据库并发访问压力问题
  • 二、分库分表带来的六大核心问题及技术挑战
    • 一、跨节点数据库Join与多维度查询难题
    • 二、分布式事务一致性挑战
    • 三、SQL排序、翻页与函数计算的跨库困境
    • 四、全局主键冲突与生成策略难题
    • 五、容量规划与二次扩容的复杂性
    • 六、分库分表中间件选型困境

一、分库分表:突破数据库性能瓶颈的原因

在这里插入图片描述

一、数据库连接数瓶颈问题

在数据库与应用程序交互的过程中,每个客户端请求都需要建立一个数据库连接。当系统访问量激增,或者数据库本身设置的最大连接数过小,就会触发 “too many connections” 错误。一旦连接数达到上限,后续的请求无法建立连接,系统响应速度会大幅下降,严重时甚至导致服务崩溃。

以 MySQL 数据库为例:

  • 默认设置:MySQL 默认的最大连接数为 100,这个数值在一般小型项目中或许够用,但在高并发的互联网应用场景下,远远不能满足需求。
  • 调整限制:虽然 MySQL 理论上允许的最大连接数可达 16384,但实际设置时不能盲目追求高值。因为每个连接都会占用内存等系统资源,过多的连接反而会加重服务器负担,影响数据库性能。

通过分库分表,将数据分散到多个数据库实例中,每个实例承担的连接请求相应减少,从而有效缓解连接数瓶颈问题。例如,原本 1000 个请求集中在一个数据库实例,分库后可能每个实例只处理 200 个请求,降低了单个实例的连接压力。

二、单表海量数据查询性能问题

随着业务的不断推进,数据库中部分核心表的数据量会快速增长。当单表数据量达到百万甚至千万级别时,即使是简单的查询操作,执行效率也会变得极低。这是因为全表扫描操作会消耗大量磁盘 I/O 和 CPU 资源,使得查询响应时间显著变长,影响用户体验。
通过分表,数据分散存储,查询操作的扫描范围大幅缩小,查询性能得到显著提升。

三、单台数据库并发访问压力问题

在高并发场景下,单台数据库服务器的处理能力是有限的。大量的读写请求集中在一台服务器上,会导致 CPU、内存、磁盘 I/O 等资源被迅速消耗,出现资源利用率过高的情况。最终,数据库响应延迟增加,甚至可能出现服务不可用的严重后果。

数据库分库则是将数据分散存储到多个数据库实例中,每个实例分担一部分业务请求。常见的分库方式是按照业务模块划分,比如:

  • 将用户相关的数据存储在用户数据库;
  • 订单数据存储在订单数据库;
  • 商品数据存储在商品数据库。

通过这种方式,每个数据库实例的并发访问量降低,系统整体的并发处理能力得到极大提升,能够更好地应对高并发请求。

二、分库分表带来的六大核心问题及技术挑战

分库分表在解决数据库性能瓶颈的同时,也引入了一系列复杂的技术问题。以下是实践中常见的六大挑战及场景解析:

一、跨节点数据库Join与多维度查询难题

核心矛盾:数据分片后,关联查询与多维度查询的复杂度呈指数级上升。

  • 传统场景对比
    分库前:通过单库SQL Join轻松实现多表关联(如SELECT * FROM orders JOIN users ON orders.uid=users.id)。
    分库后:若ordersuser_id分片,usersdept_id分片,则跨库Join需手动拆分SQL,甚至通过应用层聚合结果。
  • 多维度查询痛点
    • 案例:订单表以user_id为分片键,用户查询个人订单时效率高,但商家查询店铺订单(需按shop_id筛选)时,数据可能分散在多个库中,需遍历所有分片节点后聚合结果,性能损耗严重。

二、分布式事务一致性挑战

问题本质:跨库操作打破ACID特性,需引入分布式事务解决方案。

  • 典型场景
    电商场景中,用户下单时需同时扣减库存(库存库)和记录订单(订单库),若两库分片不同,传统本地事务失效。
  • 技术难点
    • 强一致性方案(如2PC)性能开销大,弱一致性方案(如最终一致性)需处理异常补偿逻辑。

三、SQL排序、翻页与函数计算的跨库困境

具体问题表现

  • Order By排序
    若排序字段非分片键(如按create_time排序),需从所有分片查询数据,各节点本地排序后再在应用层合并结果,消耗大量内存与CPU。
  • Limit翻页
    当页码较大时(如LIMIT 10000,10),各分片需返回前10010条数据,应用层合并后再取后10条,产生“深度分页”性能问题。
  • 函数计算
    跨库聚合函数(如COUNT(*)SUM(amount))需先在各分片计算局部结果,再汇总全局值,增加网络传输开销。

四、全局主键冲突与生成策略难题

传统自增ID失效场景

  • 分库前:单库自增ID可保证唯一性(如AUTO_INCREMENT)。
  • 分库后:若多个库均使用自增ID,会导致不同库中出现相同ID(如库1和库2的订单表均生成ID=1001)。
    解决方案挑战
  • 雪花算法(Snowflake)需保证时钟同步,分布式ID生成器(如UUID)存在无序性与存储冗余问题。

五、容量规划与二次扩容的复杂性

业务增长带来的动态挑战

  • 初次分库时若分片数量设计不足(如按10万数据/库规划),当数据量突破1000万时需重新分片(如扩容至100库)。
  • 二次扩容需解决数据迁移问题:
    • 全量迁移:停机迁移数据,但影响服务可用性。
    • 增量迁移:需处理迁移期间的增量数据同步,避免数据不一致。

六、分库分表中间件选型困境

主流技术对比与选型难点

中间件类型代表产品优势短板
客户端代理Sharding-JDBC无额外组件,与应用同进程部署需修改应用代码,运维成本高
服务端代理MyCAT应用无感知,支持多数据库协议单点性能瓶颈,版本迭代缓慢
云原生方案OceanBase自动分片与扩容,高可用性学习成本高,适用于大型企业

后续将针对每个问题展开具体解决方案,欢迎关注技术连载!

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

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

相关文章

【2025年超详细】Git 系列笔记-4 git版本号及git相关指令运用。

系列笔记 【2025年超详细】Git 系列笔记-1 Git简述、Windows下git安装、Linux下git安装_displaying 2e144 commits. adjust this setting in -CSDN博客 【2025年超详细】Git 系列笔记-2 github连接超时问题解决_2025访问github-CSDN博客 【2025年超详细】Git 系列笔记-3 Git…

图像特征检测算法SuperPoint和SuperGlue

SuperPoint 背景与概述 :SuperPoint 是一个自监督的全卷积神经网络,用于提取图像中的兴趣点及其描述子。它在 2018 年由 Magic Leap 提出,通过在合成数据集上预训练一个基础检测器 MagicPoint,然后利用同胚适应技术对真实图像数据…

nginx 和 springcloud gateway cors 跨域如何设置

在跨域资源共享(CORS)配置中,Nginx 和 API Gateway(如Spring Cloud Gateway、Kong等)是两种常见的解决方案,它们的配置逻辑和适用场景有所不同。以下是详细对比和配置示例: 一、核心区别 维度NginxAPI Gateway定位反向代理/Web服务器微服务流量入口配置位置基础设施层应…

电路笔记(信号):一阶低通RC滤波器 一阶线性微分方程推导 拉普拉斯域表达(传递函数、频率响应)分析

目录 RC 低通滤波器电路一阶线性微分方程推导拉普拉斯域表达(传递函数)传递函数 H ( s ) H(s) H(s)频率响应(令 s j ω s j\omega sjω)幅频特性:相位特性:Bode 图(线性系统频率响应&#x…

【Git】删除远程分支时,本地分支还能看到

当远程仓库的分支被删除后,本地通过 git branch -a 或 git remote show origin 仍能看到这些分支的引用,是因为本地存储的远程跟踪分支(位于 refs/remotes/origin/)未被同步更新。以下是解决方法: 解决方案&#xff1…

Cubase 通过 MIDIPLUS MIDI 键盘进行走带控制的设置方法

第一步,在官网下载xml配置文件。 https://midiplus.com/upload/202101/29/Xpro & Xpro_mini控制脚本(Cubase).zip 第二步,Cubase中按如图步骤添加映射。 将MIDI键盘连接到电脑后打开Cubase软件,点选菜单“工作室”->“工作室设置”&…

第十八章 Linux之Python定制篇——Python开发平台Ununtu

1. Ubuntu介绍 Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GUN/Linux操作系统,Ubuntu基于GUN/Linux,支持x86、amd64(即x64)和ppc架构,有全球专业开发团队(Canonical…

推荐轻量级文生视频模型(Text-to-Video)

1. ModelScope T2V by 阿里达摩院(推荐) 模型名:damo/text-to-video-synthesis 输入:一句文字描述(如:"a panda is dancing") 输出:2秒视频(16帧&#xff0c…

流编辑器sed

sed简介 sed是一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下行,这样不断重复&#xf…

商用密码基础知识介绍(上)

一、密码的基础知识 1、密码分类 根据《中华人民共和国密码法》,国家对密码实行分类管理,分为密码分为核心密码、普通密码和商用密码。 (1)核心密码、普通密码 核心密码、普通密码用于保护国家秘密信息,核心密码保护…

PROFINET主站S7-1500通过协议网关集成欧姆龙NJ系列TCP/IP主站

一、项目背景 某大型新能源电池生产企业,致力于提升电池生产的自动化水平和智能化程度。其生产线上,部分关键设备采用了不同的通信协议。在电池生产的前段工序,如原材料搅拌、涂布等环节,使用了西门子S7-1500系列PLC作为ROFINET协…

Vue3 + TypeScript + Element Plus + el-input 输入框列表按回车聚焦到下一行

应用效果:从第一行输入1,按回车,聚焦到第二行输入2,按回车,聚焦到第三行…… 一、通过元素 id,聚焦到下一行的输入框 关键技术点: 1、动态设置元素 id 属性为::id"input-appl…

FramePack 全面测评:革新视频生成体验

在 AI 视频生成领域,FramePack 自问世便备受瞩目,它凭借独特的技术架构,号称能打破传统视频生成对高端硬件的依赖,让普通电脑也能产出高质量视频。此次测评,我们将全方位剖析 FramePack,探究它在实际应用中…

html中的table标签以及相关标签

表格标签可以通过指定的标签完成数据展示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表格标签</title> </head> <body><table border"2"><!-- tr是表行 r…

springboot+vue3+vue-simple-uploader轻松实现大文件分片上传Minio

最近在写视频课程的上传&#xff0c;需要上传的视频几百MB到几个G不等&#xff0c;普通的上传都限制了文件的大小&#xff0c;况且上传的文件太大的话会超时、异常等。所以这时候需要考虑分片上传了&#xff0c;把需要上传的视频分成多个小块上传到&#xff0c;最后再合并成一个…

AI 重构代码实战:如何用飞算 JavaAI 快速升级遗留系统?

在企业数字化进程中&#xff0c;遗留系统如同陈旧的基础设施&#xff0c;虽承载着重要业务逻辑&#xff0c;但因技术落后、架构复杂&#xff0c;升级维护困难重重。飞算 JavaAI 的出现&#xff0c;为遗留系统的二次开发带来了新的转机&#xff0c;其基于智能分析与关联项目的技…

鸿蒙运动开发实战:打造专属运动视频播放器

##鸿蒙核心技术##运动开发##Media Kit&#xff08;媒体服务&#xff09;# 在当今数字化时代&#xff0c;运动健身已经成为许多人生活的一部分。今天我将在应用中添加视频播放器&#xff0c;帮助用户在运动前、运动后更好地进行热身和拉伸。这篇文章将从代码核心点入手&#xf…

一个包含15个界面高质量的电商APP客户端UI解决方案

一个包含15个界面高质量的电商APP客户端UI解决方案 您可以将其用于电商APP应用项目。包含一系列完整的界面设计元素&#xff0c;包括欢迎页、登录、注册、首页、产品分类、产品详情、尺码选择、购物车、订单、支付&#xff0c;覆盖电商APP的大部分界面。每个部分都精心设计&…

执行 PGPT_PROFILES=ollama make run下面报错,

执行 PGPT_PROFILESollama make run 下面报错&#xff0c; File "/home/powersys/.cache/pypoetry/virtualenvs/private-gpt-ZIwX6JeM-py3.11/lib/python3.11/site-packages/qdrant_client/http/api_client.py", line 108, in send_inner raise ResponseHandling…

【Docker基础】Docker核心概念:命名空间(Namespace)之User详解

目录 引言 1 基础概念回顾 1.1 命名空间概述 1.2 命名空间的类型 2 User命名空间详解 2.1 基本概念 2.2 工作原理 User命名空间的工作流程 User命名空间架构 3 应用场景 4 配置与使用 5 总结 引言 随着容器化技术的广泛应用&#xff0c;Docker已成为现代软件开发、…