当前位置: 首页 > article >正文

互联网三高-数据库高并发之分库分表

1 数据库概述

        1.1 数据库本身的瓶颈

                ① 连接数

                        MySQL默认最大连接数为100,允许的最大连接数为16384

                ② 单表海量数据查询性能

                        单表最好500w左右,最大警戒线800w

                ③ 单数据库并发压力问题

                        MySQL QPS:1500左右/秒

                ④ 系统磁盘IO、CPU瓶颈

        1.2 数据库架构演变升级

                (1)单机

                        请求量大查询就会变慢;单机不可用

                        

                (2)主从

                        主从同步,读写分离。从库可以水平扩展。满足更大读请求

                        但单服务器TPS、内存、IO等都有限

                   

                (3)双主(使用场景较少)

                        用户量上来了,写请求越来越多,一个master节点不能解决问题,添加多个主节点

                        多个主节点数据要保持一致性,写操作需要两个master之间同步,流程更加复杂              

                (4)分库分表

                        分库分表是通过‌垂直拆分‌或‌水平拆分‌对数据库进行物理或逻辑层面的分割,以解决单库单表的性能瓶颈(如连接数限制、数据量过大、硬件资源不足)和数据管理复杂度问题‌。                   

面试题:开发的项目业务增长,数据库优化思路

        思路:① 先问清楚业务增长量,平均大概增长多少

                   ② 千万不要一上来就说分库分表,要根据实际情况分析

        (1)数据库优化

                1)硬优化:如果资金充裕,可以先优化硬件条件

                        提升系统硬件,更快的IO,更多的内存,带宽、CPU、磁盘等

                2)软优化

                        ① 数据库参数优化

                        ② 分析慢查询SQL语句,分析执行计划,进行SQL改写或程序改下

                        ③ 优化索引结构

                        ④ 优化数据表结构

                        ⑤ 引入NoSQL和程序架构调整

        (2)分库分表(如果单表数据量超过1000w或者并发量特别大,还是建议分库分表)

                ① 根据业务情况而定,选择合适的分库分表策略

                ② 先看只分表是否满足需求和未来增长

                ③ 如果单分表不能满足需求,再分库分表一起

        总结:

                ① 在数据量和访问压力不是特别大的情况下,首先考虑数据库优化

                ② 如果数据量极大,且业务增长块,在考虑分库分表方案

2 分库分表的问题

        ① 跨节点数据库 join 关联查询

        ② 分库操作带来的分布式事务问题

        ③ 执行的SQL排序、翻页、函数计算问题

        ④ 数据库全局主键重复问题(以前使用的自增ID就会出现问题)

        ⑤ 容量规划,分库分表二次扩容问题

        ⑥ 分库分表技术选型问题

3 常见分库分表方案

项目、技术负责人需要有前瞻性思维

        ① 需要提前考虑1到2年的业务增长情况

        ② 对数据库服务器(QPS、连接数、容量等)做合理评估和规划

        3.1 垂直分表

                大表拆小表:基于列字段进行,分离热点字段和非热点字段,避免大字段IO

                ① 把不常用的字段放在一张表

                ② 把text、blob等大字段拆分出来一张表

                ③ 业务经常组合查询的列放在一张表中

        3.2 垂直分库

                微服务架构,就做了垂直分库,每个服务使用自己的库

        问题:垂直分库分表可以提高并发,但是依然没有解决单表数据量过大的问题。

        3.3 水平分表

                数据拆分:把一个大表分割成N个小表,表结构一样,数据不一样

                主要解决单表数据量过大的问题,减少锁表时间

        3.4 水平分库

                把同一个表数据按照一定规则分到不同的数据库中,数据库在不同的服务器上

                水平分库的粒度,比水平分表大

                多个数据库,降低系统的IO和CPU压力

        注意:水平分库分表,选择合适的分片键和分片策略,和业务场景相配合

4 分库分表常见策略

        4.1 range范围(更多适用于水平分表)

                (1)数字范围

                        自增ID,根据ID范围进行分表(左闭右开)

                        优点:ID自增长,可以无限;扩容不用迁移数据,容易理解和维护

                        缺点:数据倾斜严重,热点数据过于集中,部分节点有瓶颈,整体利用率低

                (2)时间范围

                        年、月、日范围

                        使用场景:流水数据、日志信息

                (3)空间范围

                        地理位置:省份、区域划分(华东、华中、华南...)

                        使用场景:外卖、物流等            

        4.2 Hash取模

                库ID = hashcode % 库数量

                表ID = hashcode / 库数量 % 表数量

                

                优点:保证数据较均匀的分散在不同的库、表中,可以有效的避免热点数据集中问题

                缺点:扩容不是很方便,需要数据迁移

5 分库分表技术选型

        ① TDDL(Taobao Distributed Data Layer)

                淘宝根据自己业务特点开发的

                基于JDBC规范,没有server,以client-jar形式存在,引入项目即可使用

                开源功能比较少,阿里内部使用为主

        ② Mycat

                网址:| MYCAT官方网站—中国开源分布式数据库中间件

                遵守MySQL原生协议,跨语言、跨平台、跨数据库的通用中间件代理

                基于proxy,复写了MySQL协议,将Mycat server伪装成一个MySQL数据库       

        ③ ShardingJDBC

                网址:Apache ShardingSphere

                Apache ShardingSphere 是一款分布式的数据库生态系统,包括Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar

                基于JDBC驱动,不用额外proxy,支持任意实现JDBC规范的数据库

                以jar包形式提供服务,无需额外部署和依赖

   

面试题:Mycat 和 ShardingJDBC 的区别

两者设计理念相同,主流程都是 SQL解析 -> SQL路由 -> SQL改写 -> 结果归并
        ShardingJDBC

                ① 基于JDBC驱动,不用额外proxy,在本地应用重写JDBC原生的方法,实现数据库分片形式

                ② 是基于JDBC接口的扩展,是以jar包的形式提供轻量级服务,性能高

                ③ 代码有侵入性

        Mycat

                ① 是基于proxy,复写了MySQL协议,将Mycat server 伪装成一个MySQL数据库

                ② 客户端所有的JDBC请求都必须要先交给Mycat,再由Mycat转发到具体的真实服务器
                ③ 缺点是效率偏低,中间包装了一层

                ④ 代码无侵入性

相关文章:

互联网三高-数据库高并发之分库分表

1 数据库概述 1.1 数据库本身的瓶颈 ① 连接数 MySQL默认最大连接数为100,允许的最大连接数为16384 ② 单表海量数据查询性能 单表最好500w左右,最大警戒线800w ③ 单数据库并发压力问题 MySQL QPS:1500左右/秒 ④ 系统磁盘IO、CPU瓶颈 1.2 数…...

UE5 在UE中创建骨骼动画

文章目录 创建动画的三种方式修改骨骼动画 创建动画的三种方式 方法一 打开一个已有的动画,左上角“创建资产/创建动画/参考姿势” 这将创建一个默认的A字形的骨骼,不建议这么做 方法二 打开一个已有的动画,左上角“创建资产/创建动画/当前…...

Day-01 前端 Web - HTMLCSS

目录 一、HTML 基础 1. HTML 简介 2. HTML 基本结构 3. 常用 HTML 标签 二、CSS 基础 1. CSS 简介 2. CSS 引入方式 3. 常用 CSS 选择器 4. 常用 CSS 属性 一、HTML 基础 1. HTML 简介 HTML(HyperText Markup Language)即超文本标记语言&…...

AWS出海合规解决方案:全球业务扩张的技术指南

1. 引言 随着企业加速全球化进程,出海业务面临的合规挑战日益复杂。AWS作为全球领先的云服务提供商,为企业提供了强大的工具和服务,以帮助它们满足各国的合规要求。本文将探讨如何利用AWS服务构建全面的出海合规解决方案。 2. 全球数据合规挑战 在开始讨论具体解决方案之…...

[ctfshow web入门] web38

信息收集 过滤多了php和file if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag|php|file/i", $c)){include($c);echo $flag;}}else{highlight_file(__FILE__); }解题 更多解法参考 [ctfshow web入门] web37 我们选个最简单的。但是因为php被过滤了我们改用…...

汽车CAN总线采样点和采样率详解

写在前面 本篇文章主要讲解在汽车电子中CAN总线采样率的相关知识点,内容涉及CAN波特率、采样点、时间份额、同步跳转宽度以及采样率的计算。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 1、CAN波特率 CAN波特率常规分为250kbps和500kbps,本文章主要以这两个波特率为…...

网络协议学习

最近在适配ESP32的网络驱动,借此机会先学习一下网络通信协议。 以太网帧、IP包及TCP与UDP的报文格式一文读懂网络报问中的检验和(checksum)—— 原理举例代码 提问腾讯元宝提示词: TCP窗口是干什么的拥塞窗口是什么的...

仙剑奇侠传98柔情版游戏秘籍

战斗秘技:在战斗中输入 “cheat”,然后输入 “v” 直接取胜;输入 “y” 敌人不攻击。另外,在战斗中按 “XJPXZ123” 加 “shift” 键,攻击力增加 1000%。等级提升秘籍:当李逍遥等级到达 99 级时…...

Maven error:Could not transfer artifact

问题描述 当项目从私有仓库下载依赖时,Maven 报错,无法从远程仓库下载指定的依赖包,错误信息如下: Could not transfer artifact com.ding.abcd:zabk-java:pom from/to releases (http://192.1122.101/repory/mavenleases/): 此…...

pytorch 反向传播

文章目录 概念计算图自动求导的两种模式 自动求导-代码标量的反向传播非标量变量的反向传播将某些计算移动到计算图之外 概念 核心:链式法则 深度学习框架通过自动计算导数(自动微分)来加快求导。 实践中,根据涉及号的模型,系统会构建一个计…...

WindowsPE文件格式入门06.手写最小PE

https://bpsend.net/thread-346-1-1.html 实现目标 实现目标:手写实现不大于 200 Byte大小的PE文件(又名:畸形PE/变形PE),要求MessageBox弹框显示一个字符串。实现要点:充分利用空间,在保证遵…...

并发编程--互斥锁与读写锁

并发编程–互斥锁与读写锁 文章目录 并发编程--互斥锁与读写锁1. 基本概念2. 互斥锁2.1 基本逻辑2.2 函数接口2.3示例代码12.4示例代码2 3. 读写锁3.1 基本逻辑3.2示例代码 1. 基本概念 互斥与同步是最基本的逻辑概念: 互斥指的是控制两个进度使之互相排斥&#x…...

记录第一次使用H5的WebBluetooth完成蓝牙标签打印机的(踩坑)过程

第1步 首先第一步,调试环境必须是https的,由于浏览器的强制安全策略,本地可以采用localhost 第2步 然后,如果打印需要服务UUID(Service UUID) 和 特征UUID(Characteristic UUID)&…...

2025 年“认证杯”数学中国数学建模网络挑战赛 A题 小行星轨迹预测

近地小行星( Near Earth Asteroids, NEAs )是轨道相对接近地球的小行 星,它的正式定义为椭圆轨道的近日距不大于 1.3 天文单位( AU )的小行星。 其中轨道与地球轨道最近距离小于 0.05A 且直径大于 140 米的小行星被…...

【WRF理论第十七期】单向/双向嵌套机制(含namelist.input详细介绍)

WRF运行的单向/双向嵌套机制 准备工作:WRF运行的基本流程namelist.input的详细设置&time_control 设置&domain 嵌套结构&bdy_control 配置部分 namelist 其他注意事项Registry.EM 运行 ARW 嵌套双向嵌套(two-way nesting)Moving …...

Spring Boot 3.4.3 和 Spring Security 6.4.2 结合 JWT 实现用户登录

在现代 Web 应用中,用户认证和授权是保障系统安全的核心环节。传统的 Session 认证方式在分布式系统或前后端分离场景下存在局限,而 JWT(JSON Web Token)作为一种无状态的认证机制,凭借其轻量、可扩展和跨服务的特性&a…...

Python 实现的运筹优化系统数学建模详解(0-1规划指派问题)

一、引言 在数学建模的广阔领域中,指派问题作为一类经典且重要的组合优化问题,频繁出现在各类实际场景里。例如,在人力资源管理中,如何将不同技能水平的员工高效地分配到各个项目,以实现项目成本最小化或收益最大化&am…...

TCP转发隧道

✅ 功能特性: 1. 高并发支持:采用 threading.Thread socket,可承载多并发连接 2. 异常处理完善:确保线程内异常不会崩溃整个程序 3. 可持续运行:守护线程 主线程监控机制 4. 运行状态监控: • 当前活跃连…...

React 学习 JSX

APP根组件被index.js渲染到public下的index.html下 JS中写 HTML 代码 渲染列表 条件渲染 复杂条件渲染 事件绑定 传递自定义参数 button标签中写箭头函数引用的格式 自定义参数和事件本身对象都想要的情况...

大模型论文:Language Models are Few-Shot Learners(GPT3)

大模型论文:Language Models are Few-Shot Learners(GPT3) 文章地址:https://proceedings.neurips.cc/paper_files/paper/2020/file/1457c0d6bfcb4967418bfb8ac142f64a-Paper.pdf 一、摘要 我们证明了,扩大语言模型的规模在任务无关的 few…...

一周学会Pandas2 Python数据处理与分析-Pandas2数据导出

锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 任何原始格式的数据载入DataFrame后,都可以使用类似 DataFrame.to_csv()的方法输出到相应格式的文件或者…...

深入解析栈式虚拟机与反向波兰表示法

1.1 什么是虚拟机? 虚拟机(Virtual Machine, VM)是一种软件实现的计算机系统,提供与物理计算机相类似的环境,但在软件层面运行。虚拟机的存在简化了跨平台兼容性、资源管理以及安全隔离等问题。 1.2 栈式虚拟机的架构…...

python中的数据模型-pydantic浅讲

数据模型-pydantic 1. 基本用法 通过继承 BaseModel,你可以定义一个数据模型类。类的属性使用类型注解来声明字段的类型 from pydantic import BaseModelclass User(BaseModel):name: strage: intis_active: bool True # 默认值字段类型​:每个字段…...

15.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--如何拆分单体

单体应用(Monolithic Application)是指将所有功能模块集中在一个代码库中构建的应用程序。它通常是一个完整的、不可分割的整体,所有模块共享相同的运行环境和数据库。这种架构开发初期较为简单,部署也较为方便,但随着…...

华为数字芯片机考2025合集4已校正

单选 1. 题目内容 影响芯片成本的主要因素是 Die Size 和封装,但电源、时钟等因素,特别是功耗对解决方案的成本影响较大,因此低成本设计需要兼顾低功耗设计:() 1. 解题步骤 1.1 分析题目 Die Size&…...

Java面试黄金宝典47

1. 如何设计一个秒杀系统 定义 秒杀系统是一种应对短时间内大量用户并发请求的系统,其核心目标是在高并发场景下保证系统的稳定性、数据的一致性,避免超卖等问题,同时快速响应用户请求。 秒杀系统设计需从多个层面考虑,以应对高并发场景: 前端优化: 页面静态化:将商品详…...

学习MySQL的第八天

海到无边天作岸 山登绝顶我为峰 一、数据库的创建、修改与删除 1.1 引言 在经过前面七天对于MySQL基本知识的学习之后,现在我们从基本的语句命令开始进入综合性的语句的编写来实现特定的需求,从这里开始需要我们有一个宏观的思想&…...

AI识别与雾炮联动:工地尘雾治理新途径

利用视觉分析的AI识别用于设备联动雾炮方案 背景 在建筑工地场景中,人工操作、机械作业以及环境因素常常导致局部出现大量尘雾。传统监管方式存在诸多弊端,如效率低、资源分散、监控功能单一、人力效率低等,难以完美适配现代工程需求。例如…...

GD32F303-IAP的过程和实验

使用的芯片为GD32F303VC 什么是IAP呢?有个博主写的很清楚;就是远程升级; 【单片机开发】单片机的烧录方式详解(ICP、IAP、ISP)_isp烧录-CSDN博客 我们需要写一个boot 和APP 通过 boot对APP的程序进行更新&#xf…...

众趣科技助力商家“以真示人”,让消费场景更真实透明

在当今的消费环境中,消费者权益保护问题日益凸显。无论是网购商品与实物不符、预定酒店民宿与图文描述差异大,还是游览景区遭遇“照骗”,这些问题不仅让消费者在消费和决策过程中倍感困扰,也让商家面临信任危机。 消费者在享受便…...