性能优化——分库分表

news2024/11/18 2:34:02

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.coloradmin.cn/o/928590.html

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

相关文章

CPU的基本知识介绍

相信大家对CPU一定不陌生了,从小就耳濡目染了,不过想搞清楚CPU的工作原理,并不是一件简单的事情,毕竟迄今为止,CPU的制造仍然是人类科技的巅峰。下面我们以SIT测试为主,简单的介绍下CPU,至于其工作原理,就不在此做详述。 CPU(Central Processing Unit&a…

配置开启Hive远程连接

配置开启Hive远程连接 Hive远程连接默认方式远程连接Hive自定义身份验证类远程连接Hive权限问题额外说明 Hive远程连接 要配置Hive远程连接,首先确保HiveServer2已启动并监听指定的端口 hive/bin/hiveserver2检查 HiveServer2是否正在运行 # lsof -i:10000 COMMA…

12. Oracle中case when详解

格式: case expression when condition_01 then result_01 when condition_02 then result_02 ...... when condition_n then result_n else result_default end 表达式expression符合条件condition_01,则返回…

[matlab]matlab配置mingw64编译器

第一步:下载官方绿色版本mingw64编译器然后解压放到一个非中文空格路径下面 比如我mingw64-win是我随便改的文件名,然后添加环境变量,选择用户或者系统环境变量添加下面的变量 变量名: MW_MINGW64_LOC 变量值:自己的m…

Windows如何部署Redis

一、简介 Redis (Remote Dictionary Server) 是一个由意大利人 Salvatore Sanfilippo 开发的 key-value 存储系统,具有极高的读写性能,读的速度可达 110000 次/s,写的速度可达 81000 次/s 。 二、下载 访问 https://github.com/tporadows…

如何在jdk中导入CA证书

今天在我们的测试环境就出现了如下问题,单点登录对方的系统突然访问不了了,抓取后台日志发现是如下报错 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath…

续写哈弗传奇,枭龙能行吗?

作者 | 魏启扬 来源 | 洞见新研社 上市发布会上,品牌高管信心满满的表示,“要做每个时代最好的SUV”。 上市45天后,这款新车迎来了第1万台车辆的下线。 上市3个月后,新车的影响力持续扩散,“四驱平权”的概念被越来…

element-ui table中使用type=‘selection‘ 实现禁用,勾选,默认选中不可修改 三种状态显示问题

element-ui table中使用type‘selection’ 实现禁用,勾选,默认选中不可修改 三种状态显示问题 实现效果 需求 1.status‘CheckOk 时 勾选框默认选中但不可修改勾选状态 2.status‘CheckFail 时 勾选框禁用 3.status‘ 时 勾选框可以勾选 实现思路 采…

Dynamic CRM开发 - 实体字段(三)计算字段

在 Dynamic CRM开发 - 实体字段(一)中提到了实体字段的属性字段类型:有简单、计算、汇总三种,本篇幅通过一个示例讲解计算字段。 有这样一个需求:根据用户填写的出生日期,计算年龄。 1、创建一个“出生日期”字段,时间类型即可。 2、创建一个计算字段“年龄”,如下图…

算法:图解前缀和问题

文章目录 实现原理实现思路一维前缀和模板二维前缀和模板 典型例题一维前缀和二维前缀和寻找数组中心下标除自身以外数组的乘积关系矩阵和 总结 实现原理 前缀和问题和二分查找类似,也是有一些固定的模板的,在理解原理的基础上进行实践,就能…

使用小程序实现左侧菜单,右侧列表双向联动效果

目录 引言理解双向联动效果的重要性scrollview属性介绍实现左侧菜单数据准备渲染菜单列表监听菜单点击事件实现右侧列表数据结构设计初始数据渲染监听列表滚动事件左侧菜单与右侧列表联动获取当前滚动位置计算对应菜单项联动效果优化用户体验考虑平滑滚动效果菜单高亮状态

VMware 修改ip地址 虚拟机静态ip设置 centos动态ip修改为静态ip地址 centos静态ip地址 vmware修改ip地址

虚拟机的centos服务器经常变换ip,测试起来有些麻烦,故将动态ip修改为静态ip 1. 查看vmware 虚拟机网络配置: 点击编辑,打开虚拟网络配置 2. 选中nat模式,点击nat设置,最终获取网关ip: 192.168.164.2 3. 进…

【ES5】—ES5中类与继承

一、如何定义类 类的首字母要大写,用于识别出与普通函数的不同 // 类 构造函数 function People () {this.name xiaoxiaothis.age 18 } // 实例化对象 let p1 new People()二、动态属性和方法 1. 动态属性再构造函数里面定义 // 类 function People (name, …

<C++> 类和对象(中)-类的默认成员函数

1.类的默认成员函数 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会…

【深度学习_TensorFlow】过拟合

写在前面 过拟合与欠拟合 欠拟合: 是指在模型学习能力较弱,而数据复杂度较高的情况下,模型无法学习到数据集中的“一般规律”,因而导致泛化能力弱。此时,算法在训练集上表现一般,但在测试集上表现较差&…

【Vue3】Vuex状态管理

Vuex状态管理 附:eslin中定义了不使用会报错认识应用状态管理什么是状态管理旧模式下的状态管理 Vuex的基本使用安装Vuex单一状态树 State使用vuex的方式(Vue3)mapState辅助函数(Vue2) Mutationsmutations的使用和携带…

前向传播与反向传播涉及到的知识点

目录 引入: 一、神经网络(NN)复杂度 空间复杂度 时间复杂度 二、学习率 三、指数衰减学习率——解决lr的选择 1.总结经验 2.公式引入 四、激活函数 1.简单模型:最初的理解 2.激活函数MP模型 3.优秀的激活函数的特点 4.…

广州华锐视点:VR技术在航天教育的应用优势

VR技术在航天教育中的应用可以带来许多创新和优势,为学生和公众提供更加生动、沉浸式的航天科学学习体验。以下是VR技术在航天教育中的几个主要应用方面: 航天探索模拟:VR技术可以模拟航天探索的场景,让学生和公众身临其境地感受航…

FFmpeg<第一篇>:环境配置

1、官网地址 http://ffmpeg.org/download.html2、linux下载ffmpeg 下载: wget https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2解压: tar xvf ffmpeg-snapshot.tar.bz23、FFmpeg ./configure编译参数汇总 解压 ffmpeg-snapshot.tar.bz2 之后&…

Vulnhub: DriftingBlues: 1靶机

kali:192.168.111.111 靶机:192.168.111.215 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.215 80端口首页源码 访问noteforkingfish.txt,发现为Ook!加密的密文 解密后提示需要用户eric和修改hosts文件&…