性能优化之分库分表

1、什么是分库分表

1.1、分表

将同一个库中的一张表(比如SPU表)按某种方式(垂直拆分、水平拆分)拆分成SPU1、SPU2、SPU3、SPU4…等若干张表,如下图所示:
在这里插入图片描述

1.2、分库

在表数据不变的情况下,对数据库进行拆分,即将一个库中的若干张表按某种方式拆分出来,放到不同的数据中,如下图所示:
在这里插入图片描述

1.3、分库+分表

数据库的数量和表的数量都有变化,例如将一个数据库中的一张表(比如SPU表)拆分成SPU1、SPU2、SPU3、SPU4…等若干张表,并放到不同的数据里面,如下图所示:
在这里插入图片描述

2、拆分方式

在这里插入图片描述

2.1、水平拆分

水平拆分指的是在整个表数据结构不发生变化的前提下,我们将一张表的数据拆分成多张表,如下图所示:
在这里插入图片描述
这样拆分完以后,单张表的数据量就降下来了,读写性能自然就上去了。

2.2、垂直拆分

垂直拆分指将本来放在一张表中的字段,按业务需求拆分开放到多张表中,如下图所示:
在这里插入图片描述
这样拆分完后,就将需要经常查询的数据单独放到一张表中了,性能也就提上去了。

2、何时进行分库分表?

当系统性能出现瓶颈,我们通过代码优化、加缓存、JVM性能调优、限流、搭建集群等常用的技术手段依然无法很好的解决问题时,就可以考虑采用分库分表来提高系统的性能。常见需要进行分表分表的场景有以下几点:

2.1、单表出现性能瓶颈

单表数据量较大,导致读写性能较慢。

2.2、单库出现性能瓶颈

  1. CPU压力过大(busy、load过高),导致读写性能较慢。
  2. 内存不足(缓存池命中率较低、磁盘读写IOPS过高),导致读写性能较慢。
  3. 磁盘空间不足,导致无法正常写入数据。
  4. 网络带宽不足,导致读写性能较慢。

3、如何选择分库、分表或者分库+分表

3.1、只分表

  • 单表数据量较大,单表读写性能出现瓶颈。
  • 经过评估单库的容量和性能可以支撑未来几年的数据量增长。

3.2、只分库

  • 数据库(读)写压力较大,数据库出现存储性能瓶颈。

3.3、分库分表

  • 单表数据量较大,单表读写性能出现瓶颈。
  • 数据库(读)写压力较大,数据库出现存储性能瓶颈。

4、分库分表带来的问题

4.1、分布式唯一ID

分库分表后,一张表被拆成了多张表,数据库的自增ID无法保证数据的唯一性了,因此需要映入一种方案来保证数据ID的唯一性。成熟的解决方案有以下几个:

4.1.1、UUID

优点:本地生成,性能高。

缺点:

  • 更占用存储空间,一般为长度36的字符串。
  • 不适合作为MySQL主键:无序性会导致磁盘随机IO、叶分裂等问题;普通索引需要存储主键值,导致B+树“变高”,IO次数变多。
  • 基于MAC地址的送算法可能会导致MAC地址泄漏。

4.1.2、雪花算法

在这里插入图片描述

  • 41bit时间戳:可用69年
  • 10bit工作机器:可部署1024台服务器
  • 12bit序列号:每毫秒可生成4096个ID,每秒也就是409万。

4.1.3、号段模式

在这里插入图片描述

4.2、分布式事务

4.2.1、2PC

2PC 即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit phase),2 是指两个阶段,P 是指准备阶段,C 是指提交阶段。
在这里插入图片描述

4.2.2、TCC

TCC(Try-Confirm-Cancel)是一种事务模型,其概念源自于Pat Helland的论文《Life beyond Distributed Transactions:an Apostate’s Opinion》。

TCC提出了一种基于业务层面的事务定义方式,通过由业务自身控制锁粒度,解决了复杂业务中跨表跨库等大颗粒度资源锁定的问题。

TCC将事务过程分为Try(尝试)、Confirm(确认)和Cancel(取消)三个阶段,每个阶段由业务代码控制,避免了长事务的问题,从而提高了性能。

TCC 的具体流程如下图所示:

在这里插入图片描述

4.2.3、常见的保证最终一致的处理方法

  • 回滚
  • 重试
  • 监控
  • 告警
  • 幂等
  • 对账
  • 人工补偿

4.3、跨库JOIN/分页查询

4.3.1、合适的分表字段(sharding key)

合理选择,避免大多数跨库查询
在这里插入图片描述

4.3.2、搜索引擎支持:ES

数据冗余到ES,使用ES支持复杂查询。
核心流程:

  • 使用ES查询出关键字段,例如:门店id和商品id。
  • 再使用关键字段去查询完整数据。
    注意点:
  • ES只需要存储需要搜索的字段。

4.3.3、分开查询,内存中聚合

先查询出A表数据,然后根据A表的结果查询B表。
注意点:

  • 查询出来的数据量
  • 内存占用情况

4.3.4、冗余字段

A表查询需要B表的field1字段,则将B表的field1存储一份到A表上。
适用场景:只需要少量字段,则可以直接冗余。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「Python|音视频处理|环境准备」如何在Windows系统下安装并配置音视频处理工具FFmpeg

本文主要介绍如何在Windows系统下安装并配置音视频处理工具FFmpeg,方便使用python进行音视频相关的下载或编辑处理。 文章目录 一、下载软件二、解压并配置三、验证安装 一、下载软件 首先要去 ffmpeg官网 下载软件包 由于上面直接下载的按钮是.tar.xz格式的。为了…

React Antd form.getFieldsValue() 和 form.getFieldsValue(true) 有区别吗?

背景 突然发现 antd 的 getFieldsValue()是可以传一个 true 参数的,如题,React Antd form.getFieldsValue() 和 form.getFieldsValue(true) 有区别吗? 验证 确实不一样 结论 getFieldsValue 提供了多种重载方法: getFieldsValue(name…

AcWing 898. 数字三角形 (每日一题)

大家好 我是寸铁 希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注 注意 像数组下标出现i-1的,在循环的时候从i1开始。 关于0x3f3f3f3f和Integer.MAX_VALUE 0x3f3f3f3f:1061109567 Integer.MAX_VALUE:2147483647 在选用Integ…

2023 CCPC 华为云计算挑战赛 D-塔

首先先来看第一轮的 假如有n个,每轮那k个 他们的高度的可能性分别为 n 1/C(n,k) n1 C(n-(k-11),1)/C(n,k) n2 C(n-(k-21),2)/C(n,k) ni C(n-(k-i1,i)/C(n,k) 通过概率和高度算出第一轮增加的期望 然后乘上m轮增加的高度加上初始高度,就是总共增加的高度 下面是…

东盟全面覆盖?长城战略部署核心区域市场,首个百万粉丝国产品牌

根据最新消息,长城汽车在东南亚地区取得了巨大的成功,成功进军了亚洲最大的汽车市场之一-印度尼西亚。这标志着长城汽车已经实现了东盟核心市场的全面覆盖,成为全球布局的重要一步。 在过去的几年里,长城汽车在东盟地区的市场布局…

jvm的内存划分区域

jvm划分5个区域: java虚拟机栈、本地方法栈、堆、程序计数器、方法区。 各个区各自的作用: 1.本地方法栈:用于管理本地方法的调用,里面并没有我们写的代码逻辑,其由native修饰,由 C 语言实现。 2.程序计数…

servlet,Filter,责任的设计模式,静态代理

servlet servlet是前端和数据库交互的一个桥梁 静态网页资源的技术:在前端整个运行的过程中 我们的网页代码不发生改变的这种情况就称为静态的网页资源技术动态网页资源的技术:在前端运行的过程中 我们的前端页面代码会发生改变的这种情况就称为 动态的网…

解决redis-server.exe不是内部或外部命令

报错:redis-server.exe不是内部或外部命令 原因:未进入到redis的安装目录下 解决:先找到redis安装路径,复制之后,在终端中输入cd xxxxx(redis的安装路径),进入安装目录之后再次输入redis-server.exe就成功了…

java gradle 项目 在idea上 搭建一个简单的thrift实例

前言 Thrift是RPC通信的一种方式,可以通过跨语言进行通信,最近项目需要进行跨语言的通信,因此首先尝试搭建了一个简单的thrift框架,因为网上的实例大都参差不全,通过gpt查询得到的结果对我帮助更大一点,但…

Mysql001:Mysql概述以及安装

前言:本课程将从头学习Mysql,以我的工作经验来说,sql语句真的太重要的,现在互联网所有的一切都是建立在数据上,因为互联网的兴起,现在的数据日月增多,每年都以翻倍的形式增长,对于数…

C++中数组作为参数进行传递方法

文章目录 基础:数组作为函数形参示例:1、一维数组的传递(1)直接传递(2)指针传递(3)引用传递 2、二维数组的传递(1)直接传递(2)指针传递…

回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测(多指标,多图)效果一览基本介…

DockerCompose介绍与使用

DockerCompose介绍与使用 1、DockerCompose介绍 DockerCompose用于定义和运行多容器 Docker 应用程序的工具。 通过 Compose可以使用 YAML 文件来配置应用程序需要的所有服务。一个使用Docker容器的应用,通常由多个容器组成,使用Docker Compose不再需要…

续1-续3《你的医书是假的!批评付施威的《DDD诊所——聚合过大综合症》

DDD领域驱动设计批评文集 “软件方法建模师”不再考查基础题 《软件方法》各章合集 我写了一篇文章,批评付施威的《DDD诊所——聚合过大综合症》(以下简称《DDD诊所》),文章是《你的医书是假的!批评付施威的《DDD诊…

搞懂Mybatis逆向⼯程这一篇就够了

Mybatis逆向⼯程配置与⽣成 使用基础版本前置准备项目结构导入依赖配置generatorConfig.xml数据库表 使用逆向工程点击插件使用双击之后效果UserMapper.xml的内容UserMapper接口的内容 测试逆向工程 使用增强版项目结构UserExample和UserWithBLOBsUserMapper接口 测试方法测试结…

数据库事务四大特性

事务的4大特性(ACID): 原子性(Atomicity): 事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。 一致性(Consistemcy): 事务前后,数据库的状态都满足所有的完…

相约清华!AI药物研发大赛总决赛明日开幕

2022年,百度飞桨联合清华大学药学院,筹备建设“AI 药学”产学研融合创新基地,推出了一系列AI生物计算前沿课程和人才培养计划。今年5月,百度飞桨联合清华大学药学院、百度智能云和临港实验室,共同发起了首届全球AI药物…

NSSCTF——Web题目1

目录 一、[LitCTF 2023]PHP是世界上最好的语言!! 二、[LitCTF 2023]Ping 三、[SWPUCTF 2021 新生赛]easyupload1.0 四、[SWPUCTF 2021 新生赛]easyupload2.0 五、[SWPUCTF 2021 新生赛]caidao 一、[LitCTF 2023]PHP是世界上最好的语言!&a…

【项目经理】项目管理杂谈

杂谈 1. 走上管理岗位,别再自己埋头干了2. 如何更好地管理项目进度3. 管理是“管事”而不是“管人”4. 让领导欣赏的十个沟通技巧在这里插入图片描述 1. 走上管理岗位,别再自己埋头干了 2. 如何更好地管理项目进度 3. 管理是“管事”而不是“管人” 4. 让…

06.DenseCap

目录 前言泛读摘要IntroductionRelated Work小结 精读模型模型构架全卷积定位层卷积锚点边界回归边界采样双线性插值 识别网络RNN 损失函数训练与优化 实验数据集,预处理DenseCap评价标准基线区域和图像级统计之间的差异RPN vs EdgeBoxesQualitative results 区域ca…