MySQL 基础概念
MySQL逻辑架构
MySQL 服务器逻辑架构图

最上层的服务并不是MySQL所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构,比如连接管理、授权认证、安全等等。
大多数MySQL的核心服务都在第二层,包括查询解析、分析、优化、缓存一级所有内置函数,所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。
第三层包含了存储引擎,存储引擎负责MySQL中数据的存储和提取。服务器通过API与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。
连接管理与安全性
每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心中运行。服务器会负责缓存线程,因此不需要为每一个新建的连接创建或者销毁线程。
当客户端连接到MySQL服务器时,服务器需要对其进行认证,一旦客户端连接成功,服务器会继续验证该客户端是否拥有执行某个特定查询的权限。
优化与执行
MySQL会解析查询,并创建内部数据结构,然后对其进行优化,包括重写查询、决定表的读取顺序、选择合适的索引等。
对于Select语句,在解析查询之前,服务器会先检查查询缓存,如果能够在其中找到对应的查询,服务器就不必再次执行查询解析、优化和执行的整个过程,而是直接返回查询缓存中的结果集。
并发控制
读写锁
读锁是共享的,或者说是相互不阻塞的。多个客户在同一时刻可以同时读取同一个资源,互不干扰。
写锁是排他的,只要有一个写锁存在就会阻塞其他的写锁和读锁,这是出于安全策略的考虑,只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。
在实际的数据库系统中,每时每刻都在发生锁定,当某个用户在修改某一部分数据时,MySQL会通过锁定防止其他用户读取同一数据。大多数时候,MySQL锁的内部管理都是透明的。
锁粒度
一种提高共享资源并发性的方式就是让锁定对象更有选择性。尽量只锁定需要修改的部分数据,而不是所有资源。任何时候,在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可。
问题是加锁也需要消耗资源,锁的各种操作,包括获得锁、检查锁是否已经解除,释放锁等,如果系统花费大量的时间来管理锁,而不是存取数据,那么系统的性能反而受到影响。
所谓的 锁策略,就是在锁的开销和数据的安全性之间寻求平衡。MySQL主要提供了两种最重要的锁策略。
1. 表锁
表锁是MySQL中最基本的锁策略,并且是开销最小的策略。他会锁定整张表,一个用户在对表进行写操作前,需要先获得写锁,这会阻塞其他用户对该表的所有读写操作,只有没有写锁时,其他读取的用户才能获取到锁,读锁之间不相互阻塞。
尽管存储引擎可以管理自己的锁,MySQL本身还是会使用各种有效的表锁来实现不同的目的。例如,服务器会为alter table之类的语句使用表锁,而忽略存储引擎的锁机制。
2. 行级锁
行级锁可以最大程度的支持并发处理(同时也带来了最大的锁开销)。行级锁只在存储引擎层实现。
事务
一个运行良好的事务处理系统,必须具备这些标准特征。
- 原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务中所有操作要么全部提交成功,要么全部失败。
对于一个事务,不可能只执行其中一部分操作,这就是事务的原子性。 - 一致性:数据库总是
从一个一致性状态转换到另一个一致性状态。 - 隔离性:一个事务所做的修改在最终提交以前,对其他事务是不可见得。
- 持久性:一旦事务提交,则其所做的修改就会永久保存到数据库中。即使系统崩溃,修改的数据也不会丢失。持久性是相对的概念,不可能做到100%的持久型保证的策略。
一致性:
数据完整性:在事务执行前后,需要满足所有的规则和约束。业务逻辑正确性:事务执行结果符合预定的业务逻辑。状态一致性:多个事务并发执行,事务的一致性要保证并发执行的结果与这些事务按照某种顺序串行执行的结果是一样的。持久性一致性:即使再系统发生故障后,通过恢复机制,数据库也能恢复到一个一致的状态。
隔离级别(重要)
在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。
- READ UNCOMMITED(未提交读):
事务中的修改,即使没有提交,对其他事务都是可见的,事务可以读取未提交的数据,这也被称为脏读。从性能上来说,READ UNCOMMITED也不会比其他级别好太多。 - READ COMMITTED (提交读): 大多数系统的默认隔离级别都是READ COMMITED,但MySQL不是,
READ COMMITTED 满足隔离性的简单定义:一个事务开始时,只能“看见”已经提交的事务所做的修改,这个级别有时候也叫“不可重复读”,因为两次执行同样的查询,可能会得到不同的结果。 - REPEATABLE READ (可重复读):该
级别保证了在同一个事务中多次读取同样记录的结果是一致的。但无法解决幻读问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另一个事务在该范围内插入新的记录,当之前的事务在此读取,行数会增多。InnoDB存储引擎通过多版本并发控制(MVCC)解决了幻读问题。 - SERIALIBZABLE (可串行化):最高的隔离级别,通过强制事务串行执行,避免了前面说的幻读问题。

死锁
死锁指两个或者多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。
例如:

如果凑巧,两个事务都执行了第一条update语句,同时也锁定了该行的数据,接着两个事务都尝试去执行第二条update语句,发现该行已经被对方锁定,然后两个事务都等待对方释放锁,同时又持有对方需要的锁,则陷入死循环。除非有外部因素介入才能解除死锁。
事务日志
事务日志可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把修改行为记录到硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用的是追加的方式,因此写日志的操作是磁盘上一小块区域的顺序IO,而不像随机IO需要在磁盘的多个地方移动磁头。所以,采用事务日志的方式相对来说要快很多。事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回磁盘。通常称为预写式日志,修改数据需要写两次磁盘。
多版本并发控制
MVCC主要用于提高数据库的并发性能并减少读写操作之间的锁争用。
1. 核心概念
- 数据行的多个版本:MVCC通过保存数据的多个版本来实现,
当一个事务修改数据时,InnoDB不会直接修改原数据,而是创建一个新的版本,并保留旧版本。这样,不同事务可以“看到”同一行数据的不同版本,从而减少了读写冲突。 - 隐藏列:InnoDB为每行数据额外添加了几个隐藏列。
- Undo Log:Undo Log记录了数据的旧版本信息,当事务需要回滚或者为某个事务生成一致的读视图时,会用到Undo日志中的信息。
- Read View(读视图):在可重复读的隔离级别下,为每个事务生成一个读视图,这个读视图决定了事务能看到哪些数据版本。
2. 可见性规则
- 事务只能看见在自己开始之前已经提交事务做的修改
- 事务看不见在自己开始之后才提交的事务所做的修改
- 如果一个事务可以看见某个数据行的一个版本,那么该事务也能看见这个数据行的所有旧版本。
3.在REPEATABLE READ隔离级别下,MVCC工作流程
- SELECT
InnoDB会根据以下两个条件检查每行记录
- a. InnoDB只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号)这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的。
- b.行的删除版本要么未定义,要么大于当前事务版本号,这样可以确保事务读取到的行,在事务开始之前未被删除。
只有符合上述两个条件的记录,才能返回作为查询结果。
- INSERT
InnoDB为新插入的每一行保存当前系统版本号作为行版本号。
DELETE
InnoDB为删除的每一行保存当前系统版本号作为行删除标识。
UPDATE
InnoDB插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识。
保存这两个额外系统版本号,使大多数读操作都可以不用加锁,这样设计使得读数据操作很简单,性能很好。并且也能保证只会读取到符合标准的行。MVCC只在REPEATABLE READ 以及READ COMMITED两个隔离级别下工作。
相关文章:
MySQL 基础概念
MySQL逻辑架构 MySQL 服务器逻辑架构图 最上层的服务并不是MySQL所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构,比如连接管理、授权认证、安全等等。 大多数MySQL的核心服务都在第二层,包括查询解析、分析、优化、…...
RabbitMQ 学习笔记
RabbitMQ学习笔记 一些概念 Broker :RabbitMQ服务。 virtual host: 其实就是分组。 Connection:连接,生产者消费者与Broker之间的TCP连接。 Channel:网络信道,轻量级的Connection,使用Chann…...
【区分vue2和vue3下的element UI MessageBox 弹框组件,分别详细介绍属性,事件,方法如何使用,并举例】
在 Vue 2 中,Element UI 提供了 MessageBox 弹框组件,用于显示消息提示、确认消息和获取用户输入等。而在 Vue 3 的 Element Plus 中,虽然组件和 API 可能有所变化,但基本概念和用法是相似的。下面我将分别介绍 Vue 2 的 Element …...
避而不见!BigDecimal的四大坑
BigDecimal概述 定义:Java中的类,用于表示任意精度的十进制数。适用场景:需要高精度计算的场合,如金融、货币、税收等。 一、浮点精度的坑 问题:使用BigDecimal的equals和compareTo方法比较数值时,存在精…...
IDEA 安装与激活详细教程最新(附最新激活码)2099年亲测有效!
我们先从 IDEA 官网下载 IDEA 2024.1 版本的安装包,下载链接如下: https://www.jetbrains.com/idea/download/ 点击下载(下载Ultimate版),静心等待其下载完毕即可。 激活方式: 正版专属激活码领取...
LeetCode 100334. 包含所有 1 的最小矩形面积 I
更多题解尽在 https://sugar.matrixlab.dev/algorithm 每日更新。 组队打卡,更多解法等你一起来参与哦! LeetCode 100334. 包含所有 1 的最小矩形面积 I,难度中等。 遍历 解题思路:去掉矩形上下左右全为 0 的行和列 class Solu…...
pdf只要前几页,pdf怎么只要前几页
在现代办公和学习环境中,PDF文件已成为我们日常处理信息的重要工具。然而,有时我们并不需要整个PDF文件的内容,而只是其中的几页。那么,如何高效地提取PDF文件中的特定页面呢?本文将为您介绍几种实用的方法。 打开 “ …...
JAVA JVM 是怎么判定对象已经“死去”?
Java虚拟机(JVM)使用垃圾收集(Garbage Collection,GC)机制来自动管理内存,其中包括识别和回收不再使用的对象。JVM判定对象已经“死去”(即不再被任何引用所指向)的过程主要基于以下…...
springboot加载注入bean的方式
在SpringBoot的大环境下,基本上很少使用之前的xml配置Bean,主要是因为这种方式不好维护而且也不够方便。 springboto注入bean主要采用下图几种方式,分为本地服务工程注解声明的bean和外部依赖包中的bean。 一、 springboot装配本地服务工程…...
PostgreSQL 数据库设计与管理(四)
1. 数据库设计原则 1.1 规范化 规范化是组织数据库结构的一种方法,旨在减少数据冗余并提高数据完整性。常用的规范化范式包括: 第一范式(1NF): 确保每列都是原子的,不可再分。第二范式(2NF&a…...
Studying-代码随想录训练营day21| 669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、二叉树总结
第21天,二叉树最后一篇,冲💪 目录 669.修建二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 二叉树总结 669.修建二叉搜索树 文档讲解:代码随想录修建二叉搜索树 视频讲解:手撕修建二叉…...
GraphQL:简介
GraphQL 图片来源: 我们将探索GraphQL 的基础知识,并学习如何使用Apollo将其与 React 和 React Native 等前端框架连接起来。这将帮助您了解如何使用 GraphQL、React、React Native 和 Apollo 构建现代、高效的应用程序。 什么是 GraphQL?…...
AI大模型安全挑战和安全要求解读
引言 随着人工智能技术的飞速发展,大模型技术以其卓越的性能和广泛的应用前景,正在重塑人工智能领域的新格局。然而,任何技术都有两面性,大模型在带来前所未有便利的同时,也引发了深刻的安全和伦理挑战。 大模型&…...
前端面试题-token的存放位置
哈喽小伙伴们大家好,本系列是一个专门针对前端开发岗的面试题系列,每周将会不定期分享一些面试题,希望对大家有所帮助. 面试官:token 一般在客户端存在哪儿 求职者:Token一般在客户端存在以下几个地方: (1)Cookie:Token可以存储在客户端的Cookie中。服…...
深入探讨计算机网络中的各种报文
在计算机网络中,报文(Packet)是数据传输的基本单位。不同的协议使用不同类型的报文来实现数据传输的各种功能。本文将详细探讨计算机网络中常见的几种报文类型,并通过举例说明其具体应用。 一、TCP/IP协议栈中的报文 TCP/IP协议…...
Debezium系列之:Mysql和SQLServer数据库字段类型覆盖测试
Debezium系列之:Mysql和SQLServer数据库字段类型覆盖测试 一、需求背景二、类型对比三、完整流程三、Mysql数据库全字段类型覆盖测试四、SQLServer数据库字段类型覆盖测试一、需求背景 Debezium版本升级迭代,要做字段类型测试,确保版本间字段类型的差异下游能够自动适应,或…...
Mathtype7在Word2016中闪退(安装过6)
安装教程:https://blog.csdn.net/Little_pudding10/article/details/135465291 Mathtype7在Word2016中闪退是因为安装过Mathtype6,MathPage.wll和MathType Comm***.dotm),不会随着Mathtype的删除自动删除,而新版的Mathtype中的文件…...
SQL面试题练习 —— 合并用户浏览行为
目录 1 题目2 建表语句3 题解 1 题目 有一份用户访问记录表,记录用户id和访问时间,如果用户访问时间间隔小于60s则认为时一次浏览,请合并用户的浏览行为。 样例数据 ------------------------ | user_id | access_time | ---------------…...
【Docker】docker 替换宿主与容器的映射端口和文件路径
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 docker 替换宿主与容器的映射端口和文件夹 1. 正文 1.1 关闭docker 服务 systemctl stop docker1.2 找到容器的配置文件 cd /var/lib/docker/contain…...
GPU算力租用平台推荐
推荐以下几家GPU算力租用平台: 1. AWS (Amazon Web Services) EC2 - AWS提供多种GPU实例,适合不同的计算需求,如机器学习、深度学习和图形渲染等。 - 优点:全球覆盖面广,稳定性高,服务支持全面。 …...
D3KeyHelper终极指南:5步打造暗黑3智能操作体系
D3KeyHelper终极指南:5步打造暗黑3智能操作体系 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款基于AutoHotkey开发的图…...
老马失前蹄,竟然在数据库外键上翻车了,重温外键级联巡
AI Agent 时代的沙箱需求 从 Copilot 到 Agent:执行能力的质变 在生成式 AI 的早期阶段,应用主要以“Copilot”形式存在,AI 仅作为辅助生成建议。然而,随着 AutoGPT、BabyAGI 以及 OpenAI Code Interpreter(现为 Advan…...
如何快速上手cxmooc-tools:5分钟搞定三大网课平台自动刷课
如何快速上手cxmooc-tools:5分钟搞定三大网课平台自动刷课 【免费下载链接】cxmooc-tools 一个 超星(学习通)/智慧树(知到)/中国大学mooc 学习工具,火狐,谷歌,油猴支持.全自动任务,视频倍速秒过,作业考试题库,验证码自动打码(੧ᐛ੭挂科模式,启动) 项目地址: http…...
开源工具探索——OpenDroneMap:从无人机影像到三维地理信息的自动化构建
1. 为什么你需要了解OpenDroneMap? 如果你手头有一台消费级无人机,或者正在从事地理信息相关工作,那么OpenDroneMap(简称ODM)绝对值得你花时间研究。这个开源工具能把杂乱无章的航拍照片,自动转换成专业级的…...
HTML到Figma智能转换技术:重塑设计开发工作流的核心解决方案
HTML到Figma智能转换技术:重塑设计开发工作流的核心解决方案 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html 在数字化产品开发领域,设计稿与代码实现之间的…...
3步破解限速难题:Mac版百度网盘极速方案深度解析
3步破解限速难题:Mac版百度网盘极速方案深度解析 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为Mac版百度网盘的龟速下载而苦恼&…...
Beyond Compare 5密钥生成器:快速激活与完整使用指南
Beyond Compare 5密钥生成器:快速激活与完整使用指南 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 你是否正在寻找Beyond Compare 5的激活解决方案?BCompare_Keygen是一…...
低空经济新蓝海:海事监测无人机技术全解析与应用展望
低空经济新蓝海:海事监测无人机技术全解析与应用展望 引言 大家好!随着“低空经济”被正式列为国家战略性新兴产业,无人机技术的应用版图正以前所未有的速度从我们熟悉的陆地,向更为广阔的海洋延伸。在这片“新蓝海”中࿰…...
RexUniNLU与VSCode插件开发:智能代码注释生成工具
RexUniNLU与VSCode插件开发:智能代码注释生成工具 1. 引言 作为一名每天要写几百行代码的程序员,你有没有这样的经历:写完一个复杂的函数后,盯着代码看了半天,却不知道该怎么写注释?或者更常见的是&#…...
Hunyuan-MT-7B翻译模型部署问题排查:启动失败、内存不足解决方案
Hunyuan-MT-7B翻译模型部署问题排查:启动失败、内存不足解决方案 1. 问题概述 部署Hunyuan-MT-7B翻译模型时,最常见的两类问题都与资源分配相关: 启动失败:模型加载过程中报错退出内存不足:推理过程中出现OOM&#…...
