当前位置: 首页 > news >正文

【mysql技术内幕】

MySQL之技术内幕

    • 1.MVCC模式
    • 2. 实现mvcc模式的基础点
    • 3.MySQL锁的类型
    • 4. 说下MySQL的索引有哪些吧?
    • 5. 谈谈分库分表
    • 6. 分表后的id咋么保证唯一性呢?
    • 7. 分表后非sharding key的查询咋么处理的?

1.MVCC模式

MVCC, 是multi-version concurrency control的缩写,即多版本并发控制,是一种并发控制的方法,在数据库管理系统中,实现对数据库的并发访问技术,对应编程中的事务内存。
MySQL的Innodb引擎中在隔离级别(读已提交和重复读)下的事务,对于select查询操作会访问版本链中的记录的过程。
这就使得别的事务可以修改记录,反正每次修改都会在版本链中记录。SELECT可以去版本链中查找,这就实现了读-写,写-写,的并发执行,提高了系统的性能。

2. 实现mvcc模式的基础点

  • 隐式字段:
    在这里插入图片描述
    如上图,db_row_id是数据库默认为该行记录生成的唯一隐式主键;db_trx_id是当前操作该行记录的事务id;而db_roll_ptr是一个回滚指针,用于配合undo log日志,指向上一个旧版本,;delete flag没有展示出来。
  • undo log
    在这里插入图片描述
    从上图看,不同的事务或者同一事务对同一记录修改,会导致该记录的undo log成为一条记录版本线性表,即版本链,undo log的链首就是最新的旧记录,链尾就是最早的记录。
  • ReadView
    读已提交和可重复读的区别就在于它们生成ReadView的策略不同。
    ReadView有个列表存储了当前系统活跃的读写事务,也就是当前begin了但没有提交的事务。通过这个列表来判断记录的某个版本是否对当前的事务可见。
    • 假设当前列表里的事务id为[80,100]:

      • 如果你要访问的记录版本的事务id为50,比当前列表最小的id80小,那说明这个事务在之前就提交了,所以对当前活动的事务来说是可访问的。
      • 如果你要访问的记录版本的事务id为90,发现此事务在列表id最大值和最小值之间,那就再判断一下是否在列表内,如果在那就说明此事务还未提交,所以版本不能被访问。如果不在那说明事务已经提交,所以版本可以被访问。
      • 如果你要访问的记录版本的事务id为110,那比事务列表最大id100都大,那说明这个版本是在ReadView生成之后才发生的,所以不能被访问。
    • 这些记录都是去undo log 链里面找的,先找最近记录,如果最近这一条记录事务id不符合条件,不可见的话,再去找上一个版本再比较当前事务的id和这个版本事务id看能不能访问,以此类推直到返回可见的版本或者结束。

3.MySQL锁的类型

说两个维度:

  1. 共享锁和排他锁
  • 读锁是共享的,可以通过lock in share mode实现,这时候只能读不能写。
  • 写锁是排他的,它会阻塞其他的写锁和读锁。从颗粒度来区分,可以分为表锁和行锁两种。
  1. 表锁和行锁
  • 表锁会锁住整张表并且阻塞其他用户对表的所有读写操作,比如alter修改表结构的时候会锁表。
  • 行锁分为乐观锁和悲观锁:
    • 悲观锁可以通过for update实现。
    • 乐观锁可以通过版本号实现。

两个维度结合来看:

  • 共享锁(行锁):shared locks
  1. 读锁(s锁):多个事务对于同一数据可以共享访问,不能操作修改使用方法: 加锁:SELECT * FROM table WHERE id=1 LOCK IN SHARE MODE
  2. 释锁:COMMIT/ROLLBACK
  • 排他锁(行锁):Exclusive Locks
  1. 1写锁(X锁),互斥锁/独占锁,事务获取了一个数据的X锁,其他事务就不能再获取该行的读锁和写锁(S锁、X锁),只有获取了该排他锁的事务是可以对数据行进行读取和修改
  2. 使用方法:
    DELETE/ UPDATE/ INSERT – 加锁
    SELECT * FROM table WHERE … FOR UPDATE – 加锁
    COMMIT/ROLLBACK – 释锁
  • 意向共享锁(IS):
  1. 一个数据行加共享锁前必须先取得该表的IS锁,意向共享锁之间是可以相互兼容的
  2. 意向排它锁(IX): 一个数据行加排他锁前必须先取得该表的IX锁,意向排它锁之间是可以相互兼容的
  3. 意向锁(IS、IX)是InnoDB引擎操作数据之前自动加的,不需要用户干预;
  4. 意义: 当事务操作需要锁表时,只需判断意向锁是否存在,存在时则可快速返回该表不能启用表锁
  5. 意向共享锁(IS锁)(表锁):Intention Shared Locks 表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁 前必须先取得该表的IS锁。
  6. 意向排它锁(IX锁)(表锁):Intention Exclusive Locks 表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他 锁前必须先取得该表的IX锁.

4. 说下MySQL的索引有哪些吧?

  • 普通索引(B+Tree索引):大多数 MySQL 存储引擎的默认索引类型。
  • 主键索引::唯一标识表中的每一行数据,必须是唯一的且不能为空。
  • 唯一索引:索引列的值必须唯一,不能重复。
  • 哈希索引: 使用哈希算法来加快查询速度,但只支持精确查找,不支持范围查找。
  • 全文索引:用于全文搜索,适用于大文本字段。
  • 多列索引(Composite Index):索引包含多个列,可以提高查询效率。
  • 空间索引(Spatial Index):用于存储空间数据,如地理位置信息。

5. 谈谈分库分表

  • 垂直分库
    基于现在微服务来说,都已经做到了按照业务垂直分库了。
  • 垂直分表
    垂直切分是将一张表切分为多个表,通常是按照列的关系密集程度进行切分,也可以垂直切分将经常使用到的列和不经常使用到的列切分到不同的表中。
  • 水平分表
    首先根据业务场景决定使用什么字段作为分表字段(sharding_key),比如我们现在日订单1000万,我们大部分的场景来源于C端,我们可以用user_id作为sharding_key,数据查询支持到最近3个月的订单,超过3个月的做归档处理,那么3个月的数据量就是9亿,可以分1024张表,那么每张表的数据大概就在100万左右。

比如用户id为100,那我们都经过hash(100),然后对1024取模,就可以落到对应的表上了。
在这里插入图片描述

6. 分表后的id咋么保证唯一性呢?

因为我们主键默认都是自增的,那么分表之后的主键在不同表就肯定会有冲突了。有几个办法考虑:

  • 设定步长,比如1-1024张表我们分别设定1-1024的基础步长,这样主键落到不同的表就不会冲突了。
  • 分布式ID,自己实现一套分布式ID生成算法或者使用开源的比如雪花算法这种
  • 分表后不使用主键作为查询依据,而是每张表单独新增一个字段作为唯一主键使用,比如订单表订单号是唯一的,不管最终落在哪张表都基于订单号作为查询依据,更新也一样。

7. 分表后非sharding key的查询咋么处理的?

  • 可以做成一个mapping表,比如这时候商家要查询订单列表咋么办?不带user_id查询的话你总不能扫全表吧?所以我们做一个映射表,保存商家和用户的关系,查询的时候先通过商家查询用户列表,在通过user_id去查询。
  • 大宽表,一般而言,商户端对数据实时性要求并不是很高,比如查询订单列表,可以将订单表同步到离线(实时)数仓,再基于数仓去做成一张宽表,在基于其他如es提供查询服务。
  • 数据量不是很大的话,比如后台的一些查询之后的,也可以通过多线程扫表,然后再聚合结果的方式来做。或异步的形式也是可以的。

相关文章:

【mysql技术内幕】

MySQL之技术内幕 1.MVCC模式2. 实现mvcc模式的基础点3.MySQL锁的类型4. 说下MySQL的索引有哪些吧?5. 谈谈分库分表6. 分表后的id咋么保证唯一性呢?7. 分表后非sharding key的查询咋么处理的? 1.MVCC模式 MVCC, 是multi-version concurrency c…...

快递物流单号识别API接口DEMO下载

单号识别API为用户提供单号识别快递公司服务,依托于快递鸟大数据平台,用户提供快递单号,即可实时返回可能的一个或多个快递公司,存在多个快递公司结果的,大数据平台根据可能性、单号量,进行智能排序。 应用…...

Jetpack——Room

概述 Room是谷歌公司推出的数据库处理框架,该框架同样基于SQLite,但它通过注解技术极大简化了数据库操作,减少了原来相当一部分编码工作量。在使用Room之前,要先修改模块的build.gradle文件,往dependencies节点添加下…...

Dynamic Connected Networks for Chinese Spelling Check(ACL2021)

Dynamic Connected Networks for Chinese Spelling Check(ACL2021) 一.概述 文中认为基于bert的非自回归语言模型依赖于输出独立性假设。不适当的独立性假设阻碍了基于bert的模型学习目标token之间的依赖关系,从而导致了不连贯的问题。为些&#xff0c…...

前端vue-3种生命周期,只能在各自的领域使用

上面的表格可以简化为下面的两句话: setup是语法糖,下面的两个import导入是vue3和vue2的区别,现在的vue3直接导入,比之前vue2简单 还可以是导入两个生命周期函数...

el-upload如何自定展示上传的文件

Element UI 中,el-upload 组件支持通过插槽(slot)来自定义文件列表的展示方式。这通常是通过 file-list 插槽来实现的。下面是一个使用 el-upload 组件并通过 file-list 插槽来自定义文件列表展示的完整示例代码。 在这个示例中,…...

研1日记15

1. 文心一言生成: 在PyTorch中,nn.AdaptiveAvgPool1d(1)是一个一维自适应平均池化层。这个层的作用是将输入的特征图(或称为张量)在一维上进行自适应平均池化,使得输出特征图的大小在指定的维度上变为1。这意味着&…...

基于Nginx搭建点播直播服务器

实现直播和点播离不开服务器⽀持,可以使用开源的NGINX服务器搭建直播和点播服务。 当然,NGINX本身是不⽀持视频的,需要为NGINX增加相应的RTMP模块进行支持。 1、下载nginx和rtmp模块 # nginx wget ht tp://nginx.org/download/nginx-1.18.…...

QT LineEdit显示模式

QT LineEdit显示模式 QLineEdit 显示模式:   Normal 普通模式   NoEcho 不回写,即输入内容是有的,但是显示不出来,就是不在 QLineEdit 输入框中显示,但是触发例如 textChanged 信号会将所输入的文字写出来   Password 显示密码   Pa…...

IT技术在数字化转型中的关键作用

IT技术在数字化转型中的关键作用 在当今数字化浪潮中,IT技术无疑扮演着核心角色。无论是企业的数字化转型,还是政府公共服务的智能化提升,信息技术都在推动着整个社会向更高效、更智能的方向发展。本文将探讨IT技术在数字化转型中的关键作用…...

【C++指南】C++中nullptr的深入解析

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 目录 引言 一、nullptr的引入背景 二、nullptr的特点 1.类型安全 2.明确的空指针表示 3.函数重载支…...

解决启动docker desktop报The network name cannot be found的问题

现象 deploying WSL2 distributions ensuring main distro is deployed: checking if main distro is up to date: checking main distro bootstrap version: getting main distro bootstrap version: open \wsl$\docker-desktop\etc\wsl_bootstrap_version: The network name…...

Guava: 探索 Google 的 Java 核心库

Guava 是 Google 开发的一套 Java 核心库,它提供了一系列新的集合类型(例如多映射 multimap 和多集合 multiset)、不可变集合、图形库以及用于并发、I/O、哈希、原始类型、字符串等的实用工具。Guava 在 Google 的大多数 Java 项目中得到了广…...

Qt-qmake概述

概述 qmake工具为您提供了一个面向项目的系统,用于管理应用程序、库和其他组件的构建过程。这种方法使您能够控制使用的源文件,并允许简洁地描述过程中的每个步骤,通常在单个文件中。qmake将每个项目文件中的信息扩展为一个Makefile&#xf…...

【protobuf】ProtoBuf的学习与使用⸺C++

W...Y的主页 😊 代码仓库分享💕 前言:之前我们学习了Linux与windows的protobuf安装,知道protobuf是做序列化操作的应用,今天我们来学习一下protobuf。 目录 ⼀、初识ProtoBuf 步骤1:创建.proto文件 步…...

【iOS】MVC架构模式

文章目录 前言MVC架构模式基本概念通信方式简单应用 总结 前言 “MVC”,即Model(模型),View(视图),Controller(控制器),MVC模式是架构模式的一种。 关于“架构模式”&a…...

ML 系列:机器学习和深度学习的深层次总结(08)—欠拟合、过拟合,正确拟合

ML 系列赛:第 9 天 — Under、Over 和 Good Fit 文章目录 一、说明二、了解欠拟合、过拟合和实现正确的平衡三、关于泛化四、欠拟合五、过拟合六、适度拟合七、结论 一、说明 在有监督学习过程中,对于指定数据集进行训练,训练结果存在欠拟合…...

Unity-物理系统-刚体加力

一 刚体自带添加力的方法 给刚体加力的目标就是 让其有一个速度 朝向某一个方向移动 1.首先应该获取刚体组件 rigidBody this.GetComponent<Rigidbody>(); 2.添加力 //相对世界坐标 //世界坐标系 Z轴正方向加了一个里 //加力过后 对象是否停止…...

深入探究PR:那些被忽视却超实用的视频剪辑工具

如果想要了解视频剪辑的工具&#xff0c;那一定听说过pr视频剪辑吧。如果你是新手其实我更推荐你从简单的视频剪辑工具入手&#xff0c;这次我就介绍一些简单好操作的视频剪辑工具来入门吧。 1.福晰视频剪辑 连接直达>>https://www.pdf365.cn/foxit-clip/ 这款工具操…...

Unity-麦克风输入相关

private AudioClip clip; 知识点一 获取设备麦克风信息 string[] strs Microphone.devices; for (int i 0; i < strs.Length; i) { print(strs[i]); } 知识点二 开始录制 参数一&#xff1a;设备名 传空使用默认设备 参数二&#xff1a;超过录…...

RGB无人机图像实现野火温度预测与分割技术解析

1. 项目概述&#xff1a;RGB无人机图像实现野火温度预测与分割 在野火监测领域&#xff0c;无人机搭载热成像传感器已成为主流方案&#xff0c;但高昂的硬件成本和有限的续航能力始终是规模化部署的瓶颈。我们团队开发的SAM-TIFF框架突破性地实现了仅用普通RGB摄像头就能完成两…...

Python DXF文件处理终极指南:使用ezdxf库快速掌握CAD数据操作

Python DXF文件处理终极指南&#xff1a;使用ezdxf库快速掌握CAD数据操作 【免费下载链接】ezdxf Python interface to DXF 项目地址: https://gitcode.com/gh_mirrors/ez/ezdxf Python DXF文件处理在现代工程设计和自动化流程中扮演着重要角色&#xff0c;而ezdxf库正是…...

告别插线!用ESP32的OTA Web Updater实现无线烧录,保姆级避坑指南

ESP32无线固件更新全攻略&#xff1a;从零构建OTA Web Updater系统 引言&#xff1a;为什么需要无线更新&#xff1f; 想象一下&#xff0c;你精心设计的智能温室控制系统已经安装在屋顶的密闭箱体中&#xff0c;突然发现需要修复一个关键的温度传感器逻辑错误。传统方式需要…...

RVC-WebUI语音克隆:如何在5分钟内打造你的专属AI声优

RVC-WebUI语音克隆&#xff1a;如何在5分钟内打造你的专属AI声优 【免费下载链接】rvc-webui liujing04/Retrieval-based-Voice-Conversion-WebUI reconstruction project 项目地址: https://gitcode.com/gh_mirrors/rv/rvc-webui 想象一下&#xff0c;用你自己的声音为…...

超导量子计算中的三量子比特门技术解析

1. 超导量子计算中的三量子比特门技术概述在量子计算领域&#xff0c;实现高保真度的多量子比特门操作一直是核心挑战。超导量子处理器作为当前最有前景的量子计算平台之一&#xff0c;其性能很大程度上取决于量子门操作的精度和效率。固定频率transmon架构因其出色的相干性和简…...

给工程师的傅里叶变换:从信号处理到图像压缩,用Python代码理解核心推导

给工程师的傅里叶变换&#xff1a;从信号处理到图像压缩&#xff0c;用Python代码理解核心推导 当你在Spotify上听歌时&#xff0c;算法如何从嘈杂环境中分离人声&#xff1f;手机拍照时&#xff0c;JPEG压缩为何能大幅减小文件体积却保持清晰&#xff1f;这些看似不相关的技术…...

puma-dev与Webpack Dev Server集成:解决混合内容错误的终极方案

puma-dev与Webpack Dev Server集成&#xff1a;解决混合内容错误的终极方案 【免费下载链接】puma-dev A tool to manage rack apps in development with puma 项目地址: https://gitcode.com/gh_mirrors/pu/puma-dev 在现代Web开发中&#xff0c;puma-dev作为一款快速、…...

MacOS MySQL安装

1、安装包下载地址 MySQL Community Server&#xff1a;开源版本&#xff0c;适用于个人和小型企业。MySQL Enterprise Edition&#xff1a;商业版本&#xff0c;提供额外的功能和技术支持。MySQL Cluster&#xff1a;分布式数据库系统&#xff0c;适用于高可用性和高并发场景…...

ComfyUI Portrait Master中文版:终极AI肖像提示词生成指南

ComfyUI Portrait Master中文版&#xff1a;终极AI肖像提示词生成指南 【免费下载链接】comfyui-portrait-master-zh-cn 肖像大师 中文版 comfyui-portrait-master 项目地址: https://gitcode.com/gh_mirrors/co/comfyui-portrait-master-zh-cn ComfyUI Portrait Master…...

化工行业节能改造数据监测系统方案

针对工厂存在能源利用不足、设备利用率偏低、人工抄表粗放等痛点&#xff0c;某化工企业通过落实多项节能数字化改造措施&#xff0c;实现变废为宝、节能增效等多种能源效益。主要举措包括&#xff1a;通过回收高温蒸汽驱动闲置汽轮机实现发电、通过回收富余蒸汽为生产提供热源…...