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

2023-11-14

垂直分表

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

掌握MySQL分库分表(二)Mysql数据库垂直分库分表、水平分库分表 的相关文章

  • 地理位置邻近搜索

    应用程序中有一个要求 要求在谷歌地图中找出与特定国家和 或城市绑定的所有对象 我们使用谷歌地图 API 预先计算了具有各自纬度和经度的对象并将其存储在数据库中 有时 这些对象在它们可以提供服务的特定服务范围 半径内提供服务 例如现在的情况就
  • 当我使用 IS NOT NULL 时无法创建 MySQL TRIGGER

    CREATE TRIGGER b I O AFTER UPDATE ON book FOR EACH ROW BEGIN IF OLD status IS NOT NULL AND NEW status IS NOT NULL AND NE
  • Mysql启动问题|错误!服务器退出而不更新PID文件

    有任何想法吗 Joshs MacBook Pro cdwhp joshc mysql server start Starting MySQL ERROR The server quit without updating PID file u
  • 如何从 mysqldump 中删除表

    如何删除 mysqldump 中包含大量表的一个大表的输出 我有一个 6 GB 大的数据库转储 但其中 90 只是一个日志记录表 cache entries 我的备份中不再需要它 如何轻松删除转储中描述大型日志记录表的部分 我找到了这个 h
  • PHP mysql 选择连接

    我有这个功能 以某种形式显示自动建议 function searchbyId params input strtolower params input len strlen input limit isset params limit in
  • 查找至少有 2 名员工的部门

    我需要做sql问题将显示至少有 2 人的所有部门 SELECT department name FROM department INNER JOIN employee ON department id employee department
  • 返回表中不存在的记录

    如何获取表中没有记录的ID 例如 select id name mail from users where id in 2 3 4 5 6 该查询返回记录 2 3 4 的输出 但不返回记录 5 和 6 因为表中不存在记录 现在我想知道表中没
  • 在 Magento 中编辑产品时 MySQL 错误

    这是 v 1 4 1 1 Magento 从 v 1 3 2 4 升级当我尝试编辑产品时 出现错误消息 exception Zend Db Statement Exception with message SQLSTATE 23000 In
  • 土耳其语字符显示不正确[重复]

    这个问题在这里已经有答案了 MySql 数据库使用 utf 8 编码 数据存储正确 我使用 set name utf8 查询来确保调用的数据是 utf 8 编码 只要标头字符集是 utf 8 数据库中的所有变量都可以正常工作 但静态html
  • 如何在SQL中编写连接查询[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 问题 给定 Employee 和 AnnualReviews 表 编写一个查询以返回所有从未接受过按 HireDate 排序的评论的员
  • 我的表是什么 ROW_FORMAT?

    我发现MySQL有多行格式 http dev mysql com doc refman 5 1 en data size html 并且可以指定或更改它 另外 默认的 ROW FORMAT 显然随着 MySQL 版本的变化而改变 这是可以理
  • 从 mysql 检索数据并通过电子邮件发送

    我有一个 php 页面 它显示 mysql 数据库中每个用户的课程表数据 如下所示 result mysql query sql echo table border 0 thead tr th Class Link th th Studen
  • 计算唯一值的数量

    如果我有三列 orderNumber name email 我想计算表中有多少个唯一的电子邮件 我该怎么做 像这样的声明 SELECT count email FROM orders 给我总数 I tried SELECT DISTINCT
  • mysql查询where条件比较char字段与int 0的一些现象

    有一桌 root localhost test 05 35 05 gt desc t Field Type Null Key Default Extra id int 11 NO PRI NULL auto increment studio
  • Mysql:多个表还是一张大表?

    这个问题已经被问过 但我还没有找到 1 个语音答案 最好这样做 1 张大桌子 其中 用户 ID 属性 1 属性 2 属性 3 属性 4 或 4 个小桌子 其中 用户 ID 属性 1 用户 ID 属性 2 用户 ID 属性 3 用户 ID 属
  • 创建索引可以使用现有索引吗?

    我在 A B 和 C 列上有单独的索引 我想在 A B C 三列上创建一个复合索引 我的会有什么影响existing指数对综合指数creation 数据库会利用它们吗 它们是否无关紧要 或者它们会减慢我的新复合索引的创建速度吗 我正在使用
  • url文本压缩(不是缩短)并存储在mysql中

    我在 mysql 中有一个 url 表 其中只有两个字段 id 和 varchar 255 用于 url 目前那里有超过 5000 万个 url 我的老板刚刚向我提供了有关当前项目扩展的线索 这将导致在该 url 表中添加更多的 url 预
  • LEFT JOIN 返回与 INNER JOIN 相同的结果

    我有一张桌子 磨砂膏 里面有 1600 个独特的物品 第二张桌子有100万以上 我运行 INNER JOIN 并获得 65 个匹配项 SELECT a BW Parent Number a Vendor Name b Parent Supp
  • MySQL更改表,添加具有唯一随机值的列

    我有一个表 我添加了一个名为phone 该表还有一个 id 设置为自动增量的主键 如何将随机值插入到电话列中 该值不会重复 以下 UPDATE 语句确实插入了随机值 但并非所有值都是唯一的 另外 我没有被卖掉 我投了phone字段也正确 但
  • sqlalchemy 中的随机 ID(pylon)

    我正在使用 pylons 和 sqlalchemy 我想知道如何将一些随机 id 作为primary key 最好的方法是使用随机生成的 UUID import uuid id uuid uuid4 uuid 数据类型在某些数据库中本机可用

随机推荐

  • bazel build //:go

    作者简介 何 源 古典互联网从业者 2014年底加入英语流利说 目前主要负责 Platform Team 来流利说工作之前 在 the Plant 杭州工作 内 容 大 纲 1 程序包管理 Package Management 2 代码管理
  • ENVI_IDL:读取OMI数据(HDF5)并输出为Geotiff文件+详细解析

    目录 1 课堂内容 2 知识储备 3 编程 1 课堂内容 读取OMI数据 HDF5 并输出为Geotiff文件 最重要的是数据的处理以及输出 这里我个人觉得难度不大 第一 获取OMI文件的NO2数据集的数据以及对数据中的异常值做处理 譬如全
  • 进程的五种通信方式

    一 管道 1 什么是管道 我们把一个进程连接到另一个进程的数据流称为一个管道 它是最古老的进程通信形式 2 原型 匿名管道 include
  • 【云原生之Docker实战】使用Docker部署File Manager文件管理系统

    云原生之Docker实战 使用Docker部署File Manager文件管理系统 一 File Manager简介 1 File Manager简介 2 File Manager特点 二 检查宿主机系统版本 三 检查本地docker环境
  • 微软禁俄下载、开源投毒攻击、Rust不会重写Linux、开放原子峰会7月举办

    WeOpen Insight 是腾源会推出的 开源趋势与开源洞见 内容专栏 不定期为读者呈现开源圈内的第一手快讯 优质工具盘点等 洞察开源技术发展的风向标 预见未来趋势 1 开源社区新闻 1 Linus Torvalds 称并未用 Rust
  • java计算月份所在的季度

    java计算月份所在的季度 月份 2 3 下班的时候无意中看到同事写的根据月份计算季度的代码 获取两个时间内的季度集合 返回结果说明 quarterList1 2019 1 quarterList2 2019年1季度 param start
  • IDEA Writing classes... 比较慢

    IDEA配置修改如下 1 File gt Settings 2 Build Execution Deployment gt Compiler Build process heap size 配置为 2048 3 Build Executio
  • hex转换成C语言源程序吗,第6节:把.c源代码编译成.hex机器码的操作流程

    从业十年 教你单片机入门 第6讲 第一步 打开一个现成的工程 双击桌面 keil uVision4 的图标启动keil软件 如果发现此软件默认打开了一个之前已经存在的工程 请点击上面 Project 选项 在弹出的下拉菜单中选择 Close
  • html js实现分页代码,js前端分页实现

    最近做的一个项目 整个页面的数据更新要纯ajax实现 没办法 连分页都得由我来写了 基本思路还是像后台那样实现分页 后台实现分页其实也就是用后台的程序来处理那段分页的模版 于是我想 下面是分页的模版 1 代码 JavaScript 代码 h
  • 常见的颜色空间概念

    文章目录 1 RGB颜色空间 2 HSV颜色空间 3 YCbCr颜色空间 4 Lab颜色空间 5 YUV颜色空间 1 RGB颜色空间 是最常见的面向硬件设备的彩色模型 它是人的视觉系统密切相连的模型 根据人眼结构 所有的颜色都可以看做是3种
  • 2017年阳光私募基金一季度报告

    2017年阳光私募基金一季度报告 时间 2017 05 09 10 14 00 来源 网友评论 0 条 一 证券类私募行业大数据 一 证券类私募行业大数据 一 规模篇 1 私募基金管理规模达11 90万亿 证券类规模为2 63万亿 2 百亿
  • C语言eigen存为txt文件,如何使用线性代数的C模板库Eigen?

    我有一个矩阵的图像处理算法 我有自己的矩阵运算代码 乘法 逆 但我使用的处理器是ARM Cortex A8处理器 它有NEON协处理器进行矢量化 因为矩阵运算是SIMD操作的理想情况 我要求编译器 mfpu neon mfloat abi
  • webrtc音频引擎之audio_processing介绍

    audio processing模块为语音处理的精华 包含音频的回音处理 降噪处理 自动增益处理等音频的核心处理业务算法 静音检测在另外一个模块 不知道新版与这基本算法放到了同一个模块木有 模块结构为 1 aec和aecm 也就是回音消除
  • 【Kubernetes 008】多种类型控制器区别及实际操作详解(RS,Deployment,DaemonSet,Job,ConJob)

    Pod是k8s中的基本结构 前面我们已经创建过一个 但是生产环境中往往不需要我们自己去创建pod 而是通过创建管理pod的控制器而达到自动批量管理pod的目的 这一节我们就一起来看看k8s中有哪些控制器 以及这些控制器的一些基本操作 我是T
  • Spring配置DataSource数据源

    在Spring框架中有如下3种获得DataSource对象的方法 1 从JNDI获得DataSource 2 从第三方的连接池获得DataSource 3 使用DriverManagerDataSource获得DataSource 一 从J
  • flask笔记

    python中的web框架 a socket服务端 b 路由转发 c 模板渲染 Django 同步框架 a 用的别人的 bc自己写的 Flask 同步框架 a 用的别人的 b自己写的 c用的别人的 jinja2 Tornado 异步框架 a
  • 毕业设计 单片机LSRB算法的走迷宫小车 - 嵌入式 stm32

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 马达驱动器 L298N Mpu 6050 60 RPM 直流电机 红外传感器 Arduino Pro mini 5 软件说明 LSRB 算法 6 最后 0 前言 这两年
  • JavaSE进阶

    1 使用集成开发工具eclipse 1 1 java的集成开发工具很多 包括 eclipse Intellij IDEA netbeans eclipse IBM开发的 eclipse翻译为 日食 寓意吞并SUN公司 SUN是太阳 最终没有
  • 坐标转换、地球转火星、百度转火星(python版)

    一 坐标介绍 1 地球坐标 GPS WGS84 地理坐标系统 2 火星坐标 GCJ 02 投影坐标系统 中国自己在WGS84基础上加密而成 3 地球坐标 BD 09 投影坐标系统 百度地图使用 二 坐标转换 import math pi 3
  • 掌握MySQL分库分表(二)Mysql数据库垂直分库分表、水平分库分表

    文章目录 垂直分表 拆分方法 举例 垂直分库 水平分表 水平分库 小结 垂直角度 表结构不一样 水平角度 表结构一样 垂直分表 需求 商品表字段太多 每个字段访问频次不 样 浪费了IO资源 需要进行优化 也就是 大表拆小表 基于列字段进行的