【mysql技术内幕】

MySQL之技术内幕

    • 1.MVCC模式
    • 2. 实现mvcc模式的基础点
    • 3.MySQL锁的类型
    • 4. 谈谈分库分表
    • 5. 分表后的id咋么保证唯一性呢?
    • 6. 分表后非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. 谈谈分库分表

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

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

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

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

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

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

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

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

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

相关文章

基于RK3588,AI边缘模块,单片6TOPS,可集群堆叠,Mixtile Blade 3

Mixtile Blade 3 是一款经济实惠、节能的 SBC,围绕下一代 8 纳米瑞芯微 RK3588 处理器构建。它非常适合快速开发、AI 应用程序原型设计和边缘计算,允许您集群多个 Mixtile Blade 3 SBC 以扩展您的部署。 硬件布局正反面 开箱即用的 Mixtile Blade 3 是一…

Jordan标准型

Jordan(若尔当)标准型知识梳理 szmike Keep curious 已关注 raDar 等 634 人赞同了该文章 本文主要介绍什么是Jordan标准型以及怎么把一个矩阵化为Jordan标准型。 一,Jordan标准型的定义 矩阵 J 除了主对角线和主对角线上方元素之外,其余都是0&…

漫步者头戴式耳机怎么样?漫步者、西圣、索尼三大耳机测评对比

自头戴式耳机诞生以来,凭借其出色的音质表现和时尚造型,迅速赢得了音乐爱好者的青睐。头戴式耳机不仅能够带来更加沉浸的听觉体验,还具备较强的降噪功能,让用户在嘈杂环境中依然能专注于音乐世界。 与入耳式耳机相比,…

AIGC生图基础知识

一、引言 AIGC,即AI-Generated Content,是一种利用大型预训练模型如生成对抗网络(GAN)、扩散网络(Diffusion)和语言大模型(Transformer)等人工智能技术,通过对大量数据进…

通过springcloud gateway优雅的进行springcloud oauth2认证和权限控制

代码地址 如果对你有帮助请给个start,本项目会持续更新,目标是做一个可用的快速微服务开发平台,成为接私活,毕设的开发神器, 欢迎大神们多提意见和建议 使用的都是spring官方最新的版本,版本如下&#xff1…

样本册3D翻页电子版和印刷版同时拥有是一种什么体验

​在数字化时代,样本册3D翻页电子版的兴起,让传统印刷版样本册面临着前所未有的挑战。与此同时,许多企业也开始尝试将两者相结合,以满足更多元化的市场需求。那么,拥有一份既具备数字化优势,又保留传统印刷…

生信初学者教程(一):欢迎

文章目录 配套数据R包版本安装包版权答疑在生物信息学(生信)领域,随着高通量测序技术的不断发展,大量数据涌现,为科研工作者提供了丰富的资源。然而,对于初学者而言,如何从海量的数据中挖掘有价值的信息,并开展一个完整的生信项目,仍然是一个挑战。目前,市面上针对初…

PACKMOL 一:手把手教你用Linux安装 packmol

文章目录 1. PACKMOL介绍PACKMOL的主要用途:使用场景:优点: 2. PACKMO安装3. PACKMO验证结束语 1. PACKMOL介绍 PACKMOL 是一个开源软件,用于生成分子动力学模拟所需的初始结构。它的主要功能是根据用户定义的几何约束&#xff0…

Excel--WPS 函数与公式技巧(轻松搞定各类排名)

一、直接按成绩或数值的排序(rank函数轻松搞定) 以上函数非常简单,记住两点: 1.rank排名同分作为同一名次,后面的名次需要占位,如,以上两个70分,同为第8名,那么第9名将被…

局域网变压器市场价值

2024 年全球局域网变压器市场价值为 3.056 亿美元,预计到 2030 年将达到 4.426 亿美元,2024-2030 年的复合年增长率为 5.4%。 局域网变压器市场包括用于改变电信号电压或格式的产品,以改善和简化局域网 (LAN) 上的数据传输。这些变压器对于保…

01_WebRtc_一对一视频通话

文章目录 通话网页的设计客户端实现Web的API 服务端实现 2024-9-20 很久没有写博客啦,回顾总结这段时间的成果, 写下博客放松下(开始偷懒啦)主要内容:实现网页(html)打开摄像头并显示到页面需要…

《 LiteFlow 规则引擎(1) - 入门篇》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

品牌力是什么?如何评估企业品牌影响力?

品牌影响力,其实就是指品牌在消费者心智中所占据的位置,以及它对消费者购买决策和行为的影响力。如果一个企业的品牌影响力越强,它在消费者心中的印象就越深刻,能够更有效地驱动消费者的购买行为,形成品牌忠诚度&#…

Windows用管理员运行cmd命令后无法切换盘符

解决方法:在你的切换的盘符前面加上/d,如原本命令是:cd d:\。变为:cd /d d:\。

C++的扩充和封装

作业: 手动封装一个顺序表(SeqList),分文件编译实现 有私有成员:顺序表数组的起始地址 ptr、 顺序表的总长度:size、顺序表的实际长度:len 成员函数:初始化 init(int n) 判空:em…

Zabbix 6.4添加中文语言

/usr/share/zabbix/include/locales .inc .phplocale -agrep “zh_CN" yum install langpacks-zh_CN.noarch y y y

浅谈死锁以及判断死锁的方法

引言 我们在并发情况下见过很多种锁,synchronized,ReentrantLock 等等,这些锁是为了保证线程安全,使线程同步的锁,与今天所要学习的死锁并不相同,死锁并不是一种锁,而是一种现象。 官方定义&a…

【CTF Reverse】XCTF GFSJ1101 Mine- Writeup(反编译+动态调试+Base58编码)

Mine- 运气怎么这么差? 原理 Base58 Base58是用于比特币(Bitcoin)中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。 相比Base64,Base58不使用数字"0",字母大写"O"&…

想要监控电脑?这十款电脑监控软件推荐!

在选择电脑监控软件时,重要的是要明确你的监控目的,并确保所选软件符合法律法规和道德标准。以下是我为你推荐的十款电脑监控软件,它们各自具有不同的特点和功能,适用于不同的场景和需求: 1.安企神: 作为…

从混乱到清晰!借助Kimi掌握螺旋型论文结构的秘诀!

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 写学术论文有时会让人感到头疼,特别是在组织结构和理清思路时,往往觉得无从下手。 其实,找到合适的结构不仅能帮你清晰地表达研究成果,还能让你的论文更有说…