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

掌握MySQL分库分表(二)Mysql数据库垂直分库分表、水平分库分表

文章目录

  • 垂直分表
    • 拆分方法
    • 举例
  • 垂直分库
  • 水平分表
  • 水平分库
  • 小结
    • 垂直角度(表结构不一样)
    • 水平角度(表结构一样)

垂直分表

需求:商品表字段太多,每个字段访问频次不⼀样,浪费了IO资源,需要进行优化
也就是“大表拆小表”,基于列字段进行的

拆分方法

  1. ⼀般是表中的字段较多,将不常用的或者数据较大,长度较长的拆分到扩展表如text类型字段;
  2. 访问频次低、字段大的商品描述信息单独存放在⼀张表中,访问频次较高的商品基本信息单独放在⼀张表中;
  3. 不常用的字段单独放在⼀张表; 把text,blob等大字段拆分出来放在附表中;
  4. 业务经常组合查询的列放在⼀张表中

举例

//拆分前
CREATE TABLE `product` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`title` varchar(524) DEFAULT NULL COMMENT '视频标题',`cover_img` varchar(524) DEFAULT NULL COMMENT '封⾯图',`price` int(11) DEFAULT NULL COMMENT '价格,分',`total` int(10) DEFAULT '0' COMMENT '总库存',`left_num` int(10) DEFAULT '0' COMMENT '剩余',`learn_base` text COMMENT '课前须知,学习基础',`learn_result` text COMMENT '达到⽔平',`summary` varchar(1026) DEFAULT NULL COMMENT '概述',`detail` text COMMENT '视频商品详情',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;//拆分后
CREATE TABLE `product` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`title` varchar(524) DEFAULT NULL COMMENT '视频标题',`cover_img` varchar(524) DEFAULT NULL COMMENT '封⾯图',`price` int(11) DEFAULT NULL COMMENT '价格,分',`total` int(10) DEFAULT '0' COMMENT '总库存',`left_num` int(10) DEFAULT '0' COMMENT '剩余',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;CREATE TABLE `product_detail` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`product_id` int(11) DEFAULT NULL COMMENT '产品主键',`learn_base` text COMMENT '课前须知,学习基础',`learn_result` text COMMENT '达到⽔平',`summary` varchar(1026) DEFAULT NULL COMMENT '概述',`detail` text COMMENT '视频商品详情',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

垂直分库

需求:C端项目里面,单个数据库的CPU、内存长期处于90%+的利用率,数据库连接经常不够,需要进行优化

  1. 垂直分库针对的是⼀个系统中的不同业务进行拆分, 数据库的连接资源比较宝贵且单机处理能力也有限
  2. 没拆分之前全部都是落到单⼀的库上的,单库处理能力成为瓶颈,还有磁盘空间,内存,tps等限制
  3. 拆分之后,避免不同库竞争同⼀个物理机的CPU、内存、网络IO、磁盘,所以在高并发场景下,垂直分库⼀定程度上能够突破IO、连接数及单机硬件资源的瓶颈
  4. 垂直分库可以更好解决业务层面的耦合,业务清晰,且方便管理和维护

⼀般从单体项目升级改造为微服务项目,就是垂直分库

在这里插入图片描述
但是,垂直分库分表可以提高并发,但是依然没有解决单表数据量过大的问题

水平分表

需求:当⼀张表的数据达到几千万时,查询⼀次所花的时间长,需要进行优化,缩短查询时间

  1. 把⼀个表的数据分到⼀个数据库的多张表中,每个表只有这个表的部分数据
  2. 核心是把⼀个大表,分割N个小表,每个表的结构是⼀样的数据不⼀样,全部表的数据合起来就是全部数据
  3. 针对数据量巨⼤的单张表(比如订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面去
  4. 但是这些表还是在同⼀个库中,所以单数据库操作还是有IO瓶颈,主要是解决单表数据量过⼤的问题
  5. 减少锁表时间,没分表前,如果是DDL(create/alter/add等)语句,当需要添加⼀列的时候mysql会锁表,期间所有的读写操作只能等待

在这里插入图片描述

水平分库

需求:高并发的项目中,水平分表后依旧在单个库上面,1个数据库资源瓶颈 CPU/内存/带宽等限制导致响应慢,需要进行优化

  1. 同个表的数据按照⼀定规则分到不同的数据库中,数据库在不同的服务器上
  2. 水平分库是把不同表拆到不同数据库中,它是对数据行的拆分,不影响表结构
  3. 每个库的结构都⼀样,但每个库的数据都不⼀样,没有交集,所有库的并集就是全量数据
  4. 水平分库的粒度,比水平分表更大

小结

垂直角度(表结构不一样)

垂直分表: 将⼀个表字段拆分多个表,每个表存储部分字段
好处: 1. 避免IO时锁表的次数,分离热点字段和⾮热点字段,避免⼤字段IO导致性能下降
原则: 1. 业务经常组合查询的字段⼀个表;不常⽤字段⼀个表;text、blob类型字段作为附属表

垂直分库:根据业务将表分类,放到不同的数据库服务器上
好处: 1. 避免表之间竞争同个物理机的资源,比如CPU/内存/硬盘/网络IO
原则: 1. 根据业务相关性进行划分,领域模型,微服务划分⼀般就是垂直分库

水平角度(表结构一样)

水平分库:把同个表的数据按照⼀定规则分到不同的数据库中,数据库在不同的服务器上
好处: 1. 多个数据库,降低了系统的IO和CPU压力

原则: 1. 选择合适的分片键和分片策略,和业务场景配合
2. 避免数据热点和访问不均衡、避免⼆次扩容难度大

水平分表:同个数据库内,把⼀个表的数据按照⼀定规则拆分到多个表中,对数据进⾏拆分,不影响表结构

单个表的数据量少了,业务SQL执行效率⾼,降低了系统的IO和CPU压力
原则:1. 选择合适的分片键和分片策略,和业务场景配合
2. 避免数据热点和访问不均衡、避免⼆次扩容难度大

相关文章:

掌握MySQL分库分表(二)Mysql数据库垂直分库分表、水平分库分表

文章目录垂直分表拆分方法举例垂直分库水平分表水平分库小结垂直角度(表结构不一样)水平角度(表结构一样)垂直分表 需求:商品表字段太多,每个字段访问频次不⼀样,浪费了IO资源,需要…...

算法训练营 day50 动态规划 单词拆分 多重背包理论基础

算法训练营 day50 动态规划 单词拆分 多重背包理论基础 单词拆分 139. 单词拆分 - 力扣(LeetCode) 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词…...

一文3000字用Postman从0到1实现UI自动化测试

“阅读本文大概需要4分钟。Postman不是做接口测试的吗?为什么还能做UI自动化测试呢? 其实,只要你了解Selenium的运行原理,就可以理解为什么Postman也能实现UI自动化测试了。 Selenium底层原理 运行代码,启动浏览器后…...

2023年美国大学生数学建模C题:预测Wordle结果建模详解+模型代码(一)

目录 前言 一、题目理解 背景 解析 字段含义: 建模要求 二、建模思路...

spring-boot 整合 前端框架 React 增删改查(附源码)

看了很多 关于 SpringBoot 增删改查 的文章 ,但是 React 前端框架这块似乎没什么人玩,一般都是Vue进行整合 ,所以想写一篇关于 React 整合 SpringBoot 增删改查的项目 React 学习区域 React中文教程: https://www.php.cn/doc/react/tutorial/…...

未来的城市:智慧城市定义、特征、应用、场景

智慧城市是通过连接一个地区的物理、经济和社会基础设施,以创新、有效和高效的方式应用和实施技术来发展城市的概念,以改善服务并实现更好的生活质量。智慧城市是一个将信息和通信技术融入日常治理的城市区域,旨在实现效率、改善公共服务、增…...

Qt线程池QThreadPool使用示例

目录前言1.线程池原理介绍2.QThreadPool详细介绍反复执行同一个任务设置线程过期时间线程数量信息3.QThreadPool示例4.总结前言 线程池顾名思义就是同时管理多个线程的"池子",它是一种并发处理技术,在程序中使用线程池能够提高线程的使用效率…...

【Spring】难理解的Aop编程 | 入门?

作者:狮子也疯狂 专栏:《spring开发》 坚持做好每一步,幸运之神自然会驾凌在你的身上 目录一. 🦁 前言二. 🦁 常见概念2.1 常见术语2.2 AOP入门Ⅰ. 🐇 功能场景Ⅱ. 🐇 实现过程2.3 通知类型Ⅰ.…...

2 月 25 日,论道京城 | 云原生开源项目应用实践报名开启

在数字化转型的浪潮中,云原生已经逐渐成为人们关注的焦点。开源社区作为云原生技术创新的根据地,为云原生的产业发展打造了丰富的技术生态圈,也在广泛的实践中源源不断地创造着新的机遇。想知道云原生存储技术实现了怎样的突破吗?…...

第五、六章 贪心算法、回溯算法

贪心算法 适合于贪心算法求解的问题具有:贪心选择性质、最优子结构性质。 贪心算法可以获取到问题的局部最优解,不一定能获取到全局最优解。 贪心算法总是作出在当前看来最好的选择;并且每次贪心选择都能将问题化简为一个更小的与原问题具有…...

k8s-kubectl命令

文章目录一、kubectl 基本命令1、陈述式资源管理方法:2、声明式资源管理办法二、基本信息查看三、项目的生命周期创建kubectl run命令四、金丝雀发布(Canary Release)——陈述式管理方法五、声明式管理方法kubectl create 和 kubectl apply区别一、kubectl 基本命令 1、陈述式…...

36、基于51单片机频率计 LCD 1602显示系统设计

摘要 数字频率计是一种基本的测量仪器。它被广泛应用于航天、电子、测控等领域,还被应用在计算机及各种数学仪表中。一般采用的是十进制数字,显示被测信号频率。基本功能是测量正弦信号,方波信号以及其他各种单位时间内变坏的物理量。由于其…...

【vue】elemente-ui table toggleRowSelection 默认选择无效[已解决]

项目场景: 点击按钮,弹出一个弹出框,内部出现一个table表,表内数据是动态获取,同时得勾选上几个table表的数据,类似以下的图 问题描述 点击按钮显示弹出框,加载table中的数据,默…...

SpringMVC DispatcherServlet源码(5) HttpMessageConverter扩展

前文通过阅读源码,深入分析了DispatcherServlet及相关组件的工作流程,本文不再阅读源码,介绍一下扩展HttpMessageConverter的方式。 HttpMessageConverter工作方式及扩展方式 前文介绍过,HttpMessageConverter是读写请求体和响应…...

day16_API

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、String 三、StringBuffer&StringBuilder 四、日期 零、 复习昨日 见晨考 一、String String代表字符串,类,java程序中的所有字符串&…...

十二月券商金工精选

✦研报目录✦ ✦简述✦ 按发布时间排序 华宝证券 主动暴露的得与失—从Barra框架到私募指增因子分析方法 发布日期:2022-12-01 关键词:股票、Barra、风险暴露、指数增强 主要内容:本文针对私募指数增强产品的策略流程,设计…...

JUnit

Junit 简介 JUnit是一个开源的java单元测试框架,它是XUnit测试体系架架构的一种体现 是Java语言事实上的标准单元测试库真正的优势来自于JUnit所采作用的思想和技术,而不是框架本身。推动了单元测试、测试先行的编程和测试驱动的开发JUnit衍生了许多xUn…...

MySQL学习笔记4-乐观锁和悲观锁

1.定义 乐观锁和倍灌水是并发控制采用的技术手段,确保当多个数位同时对数据中同一数据存取时,不会破坏事物的隔离性、统一性和数据库统一性 乐观锁 假定不会发生并发冲突,只在提交操作时检测是否违反数据完整性 实现方式: 记录…...

踩大坑:json格式存储wav二进制内容

需求描述: 需要将wav音频文件以二进制的形式读出,存放到 json 中,发送post请求到服务,服务解析json,得到二进制内容后放进ASR模型得出转录结果。 记一次坑: # 将wav以二进制形式读出存放到json中 f ope…...

加入CSDN的一年,我收获了这些……

加入CSDN的一年,我收获了这些……加入CSDN的一年,我收获了这些……加入CSDN的一年,我收获了这些…… 🚀🚀时光如白驹过隙般,飞逝而过。一转眼,我就已经是一名大二的学生了,也已经在…...

Minecraft源码反编译终极指南:DecompilerMC完整使用教程

Minecraft源码反编译终极指南:DecompilerMC完整使用教程 【免费下载链接】DecompilerMC This repository allows you to decompile any minecraft version that was published after 19w36a without any 3rd party mappings, you just need to execute the script o…...

IEEE LaTeX投稿被要求修改?手把手教你用color宏包高亮新增参考文献(附代码)

IEEE LaTeX投稿返修指南:精准高亮新增参考文献的实战方案 收到期刊审稿意见要求"高亮修改部分"时,许多研究者会陷入格式调整的困境——特别是当需要标记新增参考文献而又不破坏IEEE模板严谨的排版规范时。传统方法要么会改变文献条目整体格式&…...

Notion增强器:如何用岛屿组件系统彻底改变你的工作空间体验

Notion增强器:如何用岛屿组件系统彻底改变你的工作空间体验 【免费下载链接】notion-enhancer An enhancer/customiser for the all-in-one productivity workspace Notion 项目地址: https://gitcode.com/gh_mirrors/no/notion-enhancer 你是否曾经觉得Noti…...

为什么说C#是Windows开发者的瑞士军刀?WPF、ASP.NET实战解析

为什么说C#是Windows开发者的瑞士军刀?WPF、ASP.NET实战解析 在Windows生态系统中,C#始终保持着不可替代的地位。这门由微软精心设计的语言,从2000年诞生至今,已经发展成为企业级应用、桌面程序和Web服务的全能选手。尤其对于Win…...

Instructions完全指南:快速创建iOS应用引导教程的终极解决方案

Instructions完全指南:快速创建iOS应用引导教程的终极解决方案 【免费下载链接】Instructions Create walkthroughs and guided tours (coach marks) in a simple way, with Swift. 项目地址: https://gitcode.com/gh_mirrors/in/Instructions Instructions是…...

STM32智能旅行箱开发:防盗报警与语音交互实现

1. 项目概述这个基于STM32的多功能智能旅行箱项目,是我去年花了三个月时间从零开始设计实现的。作为一名嵌入式开发工程师,我经常需要出差,传统行李箱在机场、酒店等场景下的不便让我萌生了开发智能行李箱的想法。这个项目最大的特点是将多种…...

零基础5分钟上手:Wan2.2-T2V-A5B文本生成视频保姆级教程

零基础5分钟上手:Wan2.2-T2V-A5B文本生成视频保姆级教程 1. 为什么选择Wan2.2-T2V-A5B 如果你正在寻找一个快速、轻量级的文本生成视频工具,Wan2.2-T2V-A5B绝对值得考虑。这个50亿参数的模型专为快速内容创作优化,能在普通显卡上实现秒级出…...

新手入门:在快马平台用基础代码实现个人EndNote

最近在整理学术资料时,发现需要频繁记录和分类文献信息。作为编程新手,想尝试自己做个简单的网页工具来管理这些内容。通过InsCode(快马)平台的智能生成功能,居然用基础代码就实现了一个迷你EndNote,整个过程特别适合像我这样的初…...

手把手教你本地部署DeepSeek-R1 1.5B:极速CPU推理,隐私安全有保障

手把手教你本地部署DeepSeek-R1 1.5B:极速CPU推理,隐私安全有保障 1. 项目概述 DeepSeek-R1 1.5B是一个经过蒸馏优化的轻量级语言模型,专为本地CPU推理场景设计。相比原版模型,它保留了核心的逻辑推理能力,同时大幅降…...

三星固件管理工具Bifrost:跨平台固件获取与处理的技术伙伴

三星固件管理工具Bifrost:跨平台固件获取与处理的技术伙伴 【免费下载链接】SamloaderKotlin 项目地址: https://gitcode.com/gh_mirrors/sa/SamloaderKotlin 在三星设备维护与开发工作中,获取和处理官方固件往往是一项复杂且耗时的任务。传统方…...