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

news2024/11/16 19:27:22

文章目录

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

垂直分表

需求:商品表字段太多,每个字段访问频次不⼀样,浪费了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. 避免数据热点和访问不均衡、避免⼆次扩容难度大

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

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

相关文章

标题标题标题

图床(Typora uPic/PicGo 七牛云) 图床(Typora uPic/PicGo 七牛云) 笔者平时使用 Typora 编写 markdown 文档,文档中常常会放置图片,如果文档不需要分享的话,其实讲图片存放在本地就可以了…

SpringCloud alibaba-Sentinel服务降级策略

文章目录RT:异常比例:异常数:RT: 平均响应时间 (DEGRADE_GRADE_RT):当 1s 内持续进入 N 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位…

一文吃透 Spring 中的IOC和DI(二)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【前端八股文】浏览器系列:单进程与多进程、浏览器进程、异步、事件循环、同源策略、输入URL回车后、TCP三次挥手四次握手

文章目录概述单进程VS多进程浏览器进程主要分为异步场景事件循环同源策略与跨域问题输入URL回车后过程URL几大部分TCP连接与释放TCP三次握手TCP四次挥手参考本系列目录:【前端八股文】目录总结 是以《代码随想录》八股文为主的笔记。详情参考在文末。 代码随想录的博…

AI又进化了,突破性革命来了

大家好,我是 Jack。 2023 年,AI 真的杀疯了。短短不到一年的时间,当我们还在感慨 AI 一键生成的二次元画作精美万分的时候,它已经进化到了写实美照也能手到擒来的地步。 更多的效果,可以看刚刚发布的视频,…

Java爬虫系列 - 爬虫补充内容+ElasticSearch展示数据

一,定时任务Cron表达式Component public class TaskTest {Scheduled(cron "0/5 * * * * *") // 从0秒开始,每个五秒 执行一次 { 秒 分 时 天 月 周 }public void test(){System.out.println("定时任务执行了");} }二,网…

第一章 初识 Spring Security

第一章 初识 Spring Security 1、权限管理 权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现了对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资…

【白话科普】聊聊网络架构变革的关键——SDN

最近二狗子在网上冲浪的时候,不小心将 CDN 搜索成了 SDN,结果跳出来了一大堆相关的知识点。 好学的二狗子当然不会随随便便糊弄过去,于是认认真真学习了好久,终于了解了 SDN 是什么。 原来,SDN 的全称是 Software De…

第十一届“泰迪杯”数据挖掘挑战赛携“十万”大奖火热来袭

第十一届“泰迪杯”数据挖掘挑战赛 竞赛组织 主办单位: 泰迪杯数据挖掘挑战赛组织委员会 承办单位: 广东泰迪智能科技股份有限公司 人民邮电出版社 协办单位: 重庆市工业与应用数学学会、广东省工业与应用数学学会、广西数学学会、河北省工业…

心跳机制Redis

 进入命令传播阶段候,master与slave间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线 master心跳: 指令:PING 周期:由repl-ping-slave-period决定,默认10秒 作用&#…

4|无线传感器网络与应用|无线传感器网络原理及方法-许毅版|第3章:无线传感器网络通信-3.1协议结构 3.2物理层|青岛科技大学|课堂笔记

第3章:无线传感器网络通信3.1协议结构3.1.1 OSI参考模型1.网络通信协议MAC层和物理层采用IEEE 802.15.4协议*(1)物理层wsn物理层负责信号的调制和数据的收发,传输介质:无线电、红外线、光波等。(2)数据链路层wsn数据链路层负责数据成帧、帧检…

光谱实验反射、透射光谱测量

标题反射、透射光谱测量的基本原理  暗背景/基线:Dark………………………………………………………………0%  (空)白参考:Reference…………………………………………………………100%  样品反射/透射光谱:Sampl…

【Redis】 数据结构:SDS、跳跃表等底层数据结构详解

【Redis】 数据结构:SDS、跳跃表等底层数据结构详解 文章目录【Redis】 数据结构:SDS、跳跃表等底层数据结构详解底层数据结构引入Redis数据结构 - 动态字符串 SDSSDS 概述SDS动态扩容为什么使用SDS小结Redis数据结构 - 整数集 intsetIntSet概述内存布局…

从JDK源码来看XXE的触发原理和对应的防御手段

前言 这几天继续在重写GadgetInspector工具,进一步的增强该自动化工具的source点和sink点,同时增强过程中的漏报和误报的问题。 这里主要是对其中有关于XXE中的两点sink进行几点分析。 sinks DocumentBuilder类 这个JDK中内置的类是一种的DOM型的解…

基础组件之内存池

内存池技术 操作系统在运行进程的过程中,会产生内存碎片,降低了内存的使用率。内存池技术就是为了解决/减少内存碎片的一种方法,内部底层的具体实现根据不同业务场景使用不要的方式,以下是一种好理解的方式,供大家一起…

光学分辨率光声显微镜中基于深度学习的运动校正算法

在这项研究中,我们提出了一种基于深度学习的方法来校正光学分辨率光声显微镜 (OR-PAM) 中的运动伪影。该方法是一种卷积神经网络,它从具有运动伪影的输入原始数据建立端到端映射,以输出校正后的图像。首先,我们进行了仿真研究&…

PYTHON爬虫基础

一、安装package 在使用爬虫前,需要先安装三个包,requests、BeautifulSoup、selenium。 输入如下代码,若无报错,则说明安装成功。 import requests from bs4 import BeautifulSoup import selenium二、Requests应用 了解了原理…

关于IDEA中Thread.activeCount()的问题记录

回顾: Thread类的activeCount()方法用于返回当前线程的线程组中活动线程的数量。返回的值只是一个估计值,因为当此方法遍历内部数据结构时,线程数可能会动态更改。总之它返回当前线程的线程组中活动线程的数量。 在研究多线程对同一变量的修…

【FAQ】集成分析服务的常见问题及解决方案

常见问题一:如何验证Analytics是否上报/接入成功?以及关键日志含义是什么? 在初始化Analytics SDK前添加SDK日志开关如下: HiAnalyticsTools.enableLog (); 2.初始化SDK代码如下: HiAnalyticsInstance instance Hi…

kettle安装部署_简单认识_Spoon勺子界面---大数据之kettle工作笔记002

然后我们来看一下这个kettle的安装,很简单,下载解压就可以了 上面的地址是官网很烂 下面的地址好一些 这个是官网可以看到很慢,很不友好 这个是下面那个地址,可以看到 最新的是9.0了,一般都用 一般都用8.2 这里下载这个就可以了 下载以后可以看到有个pdi