MySQL架构概述

news2024/11/13 18:22:39

MySQL架构

对MySQL服务端架构的概述,包括逻辑架构、并发控制、事务和MVCC(多版本并发控制)等内容。

思维导图

逻辑架构

逻辑架构

连接/线程管理

最上层负责与客户端交互,包括连接处理、身份验证、确保安全性等。

解析器、优化器

MySQL核心能力都在这一层。主要负责解析SQL语句、优化SQL语句和执行内置的函数。

优化器并不关心表使用的是什么存储引擎,但存储引擎对于查询优化是有影响的。优化器会向存储引擎询问它的一些功能、某个具体操作的成本,以及表数据的统计信息。

存储引擎

存储引擎负责MySQL中数据的读写,只是简单的执行上层传下来的SQL语句,可以理解为一个黑盒。MySQL支持多种存储引擎,但推荐使用的还是innodb引擎,功能比较强大

并发控制

在互联网业务里面,几乎都会遇到并发查询问题,读写同时发生。这时候就要采取一定的并发控制策略防止产生预期外的情况。

读写锁

读锁是共享的,写锁是排他的,写锁既会堵塞读锁也会堵塞写锁,保证确保在特定的时间点只有一个客户端能执行写入。

锁的粒度

理论上,锁的粒度越小,发生冲突的可能性就越小,性能就越强,但是管理锁也需要资源,粒度越小,锁需要的资源就越多,也会影响性能。锁的策略也就是锁开销和数据安全性之间的权衡。有两种最重要的锁策略:

  • 表锁:锁住整张表,客户端进行写操作需要先获取表锁
  • 行级锁:锁住表中的某一行,性能强但是开销大

行级锁是在存储引擎而不是服务器中实现的

事务

事务就是一组SQL语句,作为一个工作单元以原子方式进行处理。

ACID

老生常谈的ACID。

原子性(atomicity)

一个事务必须被视为一个不可分割的工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

一致性(consistency)

数据库总是从一个一致性状态转换到下一个一致性状态。我把它理解为能量守恒定律

隔离性(isolation)

一个事务所做的修改在最终提交以前,对其他事务是不可见的。

持久性(durability)

一旦提交,事务所做的修改就会被永久保存到数据库中。此时即使系统崩溃,数据也不会丢失,注意没有完美的持久性,毕竟硬盘也有可能损坏。

隔离级别

又是一个常见的八股知识。

读未提交

可以查看其他事务中还没有提交的修改。万一其他事务回滚了,而当前事务根据这个数据做了操作,会导致很多问题。读取未提交的数据,也称为脏读

读已提交

大多数数据库系统的默认隔离级别是读已提交(但MySQL是可重复读)。

一个事务可以看到其他事务在它开始之后提交的修改,但在该事务提交之前,其所做的任何修改对其他事务都是不可见的。这个级别仍然会造成不可重复读,这意味着同一事务中两次执行相同语句,可能会看到不同的数据结果,因为第二次读可能读取到其他事务刚刚提交的数据。

可重复读

保证了在同一个事务中多次读取相同行数据的结果是一样的,但还是会造成幻读(读取到了其他事务刚刚插入的行,也就是新数据)。

InnoDB默认为可重复读隔离级别,并且通过间隙锁策略来防止在这个隔离级别上的幻读:InnoDB不只锁定在查询中涉及的行,还会对索引结构中的间隙进行锁定,以防止幻行被插入。

可串行化

最高的隔离级别。该级别通过强制事务按序执行,使不同事务之间不可能产生冲突。

可串行化会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题
级别的不可重复读问题,保证了在同一个事务中多次读取相同行数据的结果是一样的

死锁

死锁是指两个或多个事务相互持有和请求相同资源上的锁,产生了循环依赖。

当多个事务试图以不同的顺序锁定资源时会导致死锁。当多个事务锁定相同的资源时,也可能会发生死锁。

一般的解决方案有死锁检测和锁超时两种,InnoDB目前处理死锁的方式是将持有最少行级排他锁的事务回滚。

事务日志

事务日志有助于提高事务的效率。存储引擎只需要更改内存中的数据副本,而不用每次修改磁盘中的表,这会非常快。然后再把更改的记录写入事务日志中,事务日志会被持久化保存在硬盘上。

MVCC

MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。

MVCC的工作原理是使用数据在某个时间点的快照来实现的,每一行记录需要记录当前操作这一行的事务ID和旧的数据记录,这样才能做到根据当前事务的可见策略来判断当前行数据是否对这个事务可见。

保存这些数据的好处是大多数读取查询都不再需要获取锁,不好的地方是每一行存储了额外的数据,增加了管理成本。

读未提交与MVCC不兼容,是因为不管怎样都读最新版本。可串行化与MVCC也不兼容,是因为读取会锁定它们返回的每一行。

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

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

相关文章

机器学习从入门到进阶所需学习资料-包括书、视频、源码

本文整理了一些入门到进阶机器学习所需要的一些免费的精品视频课程,一些优质的书籍和经典的代码实战项目。本文整理自网络,源地址:https://github.com/linxid/Machine_Learning_Study_Path视频1.1 吴恩达老师机器学习课程:•Cours…

【【黑马SpringCloud(2)】微服务调用

服务调用和网关Feign远程调用Feign自定义配置Feign性能优化使用连接池代替默认的URLConnection解决重复代码继承方式抽取方式Gateway服务网关gateway快速入门断言过滤器全局过滤器过滤器执行顺序:跨域问题Feign远程调用 RestTemplate发起远程调用的代码&#xff1a…

走进 CSS

看完本篇博客,你能收获: 👉 了解 CSS 是什么?👉 学会 CSS 怎么用?👉 CSS的选择器👉 如何用 CSS 美化网页 文章目录01 CSS 是什么?02 CSS的发展史03 CSS 快速入门04 CSS的…

唯一索引范围查询锁 bug修复了

唯一索引范围查询锁 bug修复了 其他资料介绍入下: session A 是一个范围查询,按照原则 1 的话,应该是索引 id 上只加 (10,15] 这个 next-key lock ,并且因 为 id 是唯一键,所以循环判断到 id15 这一行就应该停止了。…

生成标题的节点

生成标题的节点目录概述需求:设计思路实现思路分析1.mine 的概述2 mi是否自动计算未来的处理人参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,w…

智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》

智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》 目录 智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》 1. 前言 2.车牌号码说明 3.车牌数据集CCPD (1)车牌数据集CCPD说明 (2&#xff09…

Eclipse调试python

Eclipse调试pythonF5:Step Into 单步调试,跳入函数内部F6:Step Over 单步调试,不跳入函数内部,执行当前代码F7:Step Return 返回到当前函数的尾部,跳转到调用函数的位置F8:Resume 跳…

DDOS渗透与攻防(二)之SYN-Flood攻击

系列文章 DDOS渗透与攻防(一)之拒绝服务攻击概念介绍 SYN-Flood攻击 1.SYN-Flood拒绝服务攻击 (1).攻击协议原理介绍说明_Syn-Flood SYN Flood (SYN洪水) 是种典型的DoS (Denial of Service,拒绝服务) 攻击。效果就是服务器TCP连接资源耗尽,停止响应…

8 种异步实现方式,性能炸裂!

异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:发送短信、邮件、异步更新等,这些都是典型的可以通过异步实…

LeetCode动态规划经典题目(九):0-1背包问题

学习目标: 0-1背包问题 学习内容: 9. LeetCode416. 分割等和子集https://leetcode.cn/problems/partition-equal-subset-sum/ 10. LeetCode1049. 最后一块石头的重量 IIhttps://leetcode.cn/problems/last-stone-weight-ii/ 学习产出: 独…

Makefile学习⑦:编译动态链接库和静态库

Makefile学习⑦:编译动态库和静态库 编译链接动态库 动态链接库名词解释: 动态:运行时才去加载,动态加载 链接:指库文件和二进制程序分离,用某种特殊手段维护两者之间的关系 库 :库文件&#…

8、条件语句

目录 一、简单的if条件语句 二、if…else语句 三、if…else if多分支语句 四、switch多分支语句 一、简单的if条件语句 语法如下: 布尔表达式:必要参数,表示最后返回的结果必须是一个布尔值。它可以是一个单纯的布尔变量或常量&#xff…

IntelliJ IDEA 插件推荐

本篇主要统计了一些 Idea 的常用插件 分享一下 感谢作者zzp google-java-format 作用 代码格式化风格。 插件官网 google-java-format - plugin for IntelliJ IDEs | JetBrains 使用说明 插件安装完成后需要到Preferences->Other Settings->google-java-format Set…

供应商管理难点在哪 SRM供应商系统助推企业提升管理水平

在如今,对于需求企业来说,要保证企业内部的正常生产或科研工作等过程的不间断,就需要有一批可靠的供应商定期提供必需的物资供应。而供应商管理的最终目的就是根据采购需求来建立一个稳定可靠的供应商管理队伍,为企业提供高质量的…

【Leetcode每日一题】27. 原地移除元素|神级理解双指针

博主简介:努力学习的预备程序媛一枚~博主主页: 是瑶瑶子啦所属专栏: LeetCode每日一题–进击大厂 目录题目描述题目分析:代码实现补充训练--验证代码实现题目描述 链接: 27. 移除元素 给你一个数组 nums 和一个值 val,你需要 原…

Java开发实现图书管理系统

本文用Java代码实现图书代码管理系统,有些地方可能会有纰漏,希望各位大佬鉴赏!! 文章目录 文章目录 一、Java实现图书管理系统 1.1创建book包 二、创建图书管理系统的操作包 2.1创建Operation接口 三、创建User包 3.1创建User类 四…

并发编程学习(七):线程活跃性:死锁、活锁、饥饿

线程活跃性 是指代码有限,但由于某种原因,导致线程一直未执行完成。 1、死锁 指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推…

四元数学习笔记(一):初识四元数

1 四元数的定义 1.1 为什么要使用四元数 旋转向量用 9 个量来描述 3 个自由度的旋转,具有冗余性;欧拉角和旋转向量是紧凑的,但是具有奇异性。事实上,我们找不到不带奇异性的向量描述方式。 回忆之前学习过的复数,我…

强化学习笔记:基于策略的学习之策略迭代(python实现)

目录 1. 前言 2. 算法流程 3. 代码及仿真结果 3.1 class PolicyIterationPlanner() 3.2 测试代码 3.3 运行结果 3.3.1 价值估计结果 3.3.2 策略迭代得到的最终策略 1. 前言 在强化学习中,根据是否依赖于(环境的)模型,可以分…

OAK相机与树莓派

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手…