性能优化之分库分表

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表上。
适用场景:只需要少量字段,则可以直接冗余。

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

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

相关文章

“R语言+遥感“水环境综合评价方法

详情点击链接:"R语言遥感"水环境综合评价方法 一:R语言 1.1 R语言特点(R语言) 1.2 安装R(R语言) 1.3 安装RStudio(R语言) (1)下载地址 &…

前端开发中的单伪标签清除和双伪标签清除

引言 在前端开发中,我们经常会遇到一些样式上的问题,其中之一就是伪元素造成的布局问题。为了解决这个问题,我们可以使用伪标签清除技术。本篇博客将介绍单伪标签清除和双伪标签清除的概念、用法和示例代码,并详细解释它们的原理…

服务器卡顿如何排查?

服务器网络卡,一般情况下,请先检查您服务器的使用情况。 1.CPU使用率是否大于50%。 2.网络使用率是否过高。 3.内存使用率是否过高。 如果出现上述情况,则表明您的服务器或网络无法承载您目前的服务,请联系技术人员调整您的资…

如何基于亚马逊云科技打造高性能的 SQL 向量数据库 MyScale

MyScale 是一款完全托管于亚马逊云科技、支持 SQL 的高效向量数据库。MyScale 的优势在于,它在提供与专用向量数据库相匹敌甚至优于的性能的同时,还支持完整的 SQL 语法。在这篇文章中,我们将阐述 MyScale 是如何借助亚马逊云科技的基础设施&…

pnpm无法加载文件 (解决方法 )

现在要运行一个TS的项目,我的电脑上没有安装pnpm,导致我的vscode一直报错无法加载。 pnpm安装: npm install -g pnpm pnpm : 无法加载文件 pnpm : 无法加载文件 C:\Users\HP\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运…

英语略读三

课文的客观,或者逻辑推理 同增通减 比错 对比选项,找一个明显的区别 防并列,文章再说主语在干嘛干嘛的,但是与答案的角度不一样,是并列的关系 在对比选项,不是证明正确的 具体问题具体分析,but…

【30天熟悉Go语言】10 Go异常处理机制

作者:秃秃爱健身,多平台博客专家,某大厂后端开发,个人IP起于源码分析文章 😋。 源码系列专栏:Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列(含:Ribbon、Feign&…

亚马逊云科技云技能学习

文章目录 前言一、云技能学习的优势二、云技能学习的学习路径三、云技能学习的未来前景总结 前言 亚马逊云科技(Amazon Web Services,AWS)作为全球领先的云计算服务提供商,提供了众多创新的云技术解决方案。在这些方案中&#xf…

[Linux]文件IO

文章目录 1. 文件描述符1.1 虚拟地址空间1.1.1 存在的意义1.1.2 分区 1.2 文件描述符1.2.1 文件描述符1.2.2 文件描述符表 2. Linux系统文件IO2.1 open/close2.1.1 函数原型2.1.2 close函数原型2.1.3 打开已存在文件2.1.4 创建新文件2.1.5 文件状态判断 2.2 read/write2.2.1 re…

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【四】

😀前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【四】,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章…

VMware虚拟机连不上网络

固定ip地址 进入网络配置文件 cd /etc/sysconfig/network-scripts 打开文件 vi ifcfg-ens33 编辑 BOOTPROTO设置为static,有3个值(decp、none、static) BOOTPROTO"static" 打开网络 ONBOOT"yes" 固定ip IPADDR1…

为什么需要websocket?

一、为什么需要websocket? 前端和后端的交互模式最常见的就是前端发数据请求,从后端拿到数据后展示到页面中。如果前端不做操作,后端不能主动向前端推送数据,这也是http协议的缺陷。 因此,一种新的通信协议应运而生---…

【滑动窗口】leetcode1004:最大连续1的个数

一.题目描述 最大连续1的个数 这道题要我们找最大连续1的个数,看到“连续”二字,我们要想到滑动窗口的方法。滑动窗口的研究对象是一个连续的区间,这个区间需要满足某个条件。那么本题要找的是怎样的区间呢?是一个通过翻转0后得到…

go 正则表达式

目录 1. go 正则表达式1.1. Check if the string contains the desired value1.2. MustCompile should not be used1.3. Make the regex string always valid by QuoteMeta1.4. Find the desired word in a string by FindAllString1.5. Extract the desired word/value from a…

抖音web主页视频爬虫

需要抖音主页视频爬虫源码的发私信,小偿即可获得长期有效的采集程序。 比构造 s_v_web_id 验证滑块的方法更快,更稳定。

龙智案例:某大型零售企业如何打造高速、现代化的ITSM体系

在2023 DevOps国际峰会北京站的现场,我们对话了龙智咨询顾问胡若愚,他为我们奖助了一位零售业的大型客户是如何在数字化浪潮中,凭借龙智提供的Jira Service Management产品及服务,打造现代化ITSM平台,提升客户满意度。…

JVM理论知识

一、JVM内存结构 java的内存模型主要分为5个部分,分别是:JVM堆、JVM栈、本地栈、方法区还有程序计数器,他们的用途分别是: JVM堆:新建的对象都会放在这里,他是JVM中所占内存最大的区域。他又分为新生区还…

2022年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;最长上升子序列 一个数的序列bi&#xff0c;当b1 < b2 < … < bS的时候&#xff0c;我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN)&#xff0c;我们可以得到一些上升的子序列(ai1, ai2, …, aiK)&#xff0c;这里1 < i1 < i2 &…

【中危】Apache Ivy<2.5.2 存在XXE漏洞 (CVE-2022-46751)

漏洞描述 Apache Ivy 是一个管理基于 ANT 项目依赖关系的开源工具&#xff0c;文档类型定义(DTD)是一种文档类型定义语言,它用于定义XML文档中所包含的元素以及元素之间的关系。 Apache Ivy 2.5.2之前版本中&#xff0c;当解析自身配置、Ivy 文件或 Apache Maven 的 POM 文件…

设计模式--适配器模式(Adapter Pattern)

一、什么是适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式主要用于解决不兼容接口之间的问题&#xff0c;使得原本…