MySQL 基础概念

MySQL逻辑架构

MySQL 服务器逻辑架构图
在这里插入图片描述
最上层的服务并不是MySQL所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构,比如连接管理、授权认证、安全等等。

大多数MySQL的核心服务都在第二层,包括查询解析、分析、优化、缓存一级所有内置函数,所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。

第三层包含了存储引擎,存储引擎负责MySQL中数据的存储和提取。服务器通过API与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。

连接管理与安全性

每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心中运行。服务器会负责缓存线程,因此不需要为每一个新建的连接创建或者销毁线程。

当客户端连接到MySQL服务器时,服务器需要对其进行认证,一旦客户端连接成功,服务器会继续验证该客户端是否拥有执行某个特定查询的权限。

优化与执行

MySQL会解析查询,并创建内部数据结构,然后对其进行优化,包括重写查询、决定表的读取顺序、选择合适的索引等。
对于Select语句,在解析查询之前,服务器会先检查查询缓存,如果能够在其中找到对应的查询,服务器就不必再次执行查询解析、优化和执行的整个过程,而是直接返回查询缓存中的结果集

并发控制

读写锁

读锁是共享的,或者说是相互不阻塞的。多个客户在同一时刻可以同时读取同一个资源,互不干扰。

写锁是排他的,只要有一个写锁存在就会阻塞其他的写锁和读锁,这是出于安全策略的考虑,只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。

在实际的数据库系统中,每时每刻都在发生锁定,当某个用户在修改某一部分数据时,MySQL会通过锁定防止其他用户读取同一数据。大多数时候,MySQL锁的内部管理都是透明的。

锁粒度

一种提高共享资源并发性的方式就是让锁定对象更有选择性。尽量只锁定需要修改的部分数据,而不是所有资源。任何时候,在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可。

问题是加锁也需要消耗资源,锁的各种操作,包括获得锁、检查锁是否已经解除,释放锁等,如果系统花费大量的时间来管理锁,而不是存取数据,那么系统的性能反而受到影响。

所谓的 锁策略,就是在锁的开销和数据的安全性之间寻求平衡。MySQL主要提供了两种最重要的锁策略。

1. 表锁

表锁是MySQL中最基本的锁策略,并且是开销最小的策略。他会锁定整张表,一个用户在对表进行写操作前,需要先获得写锁,这会阻塞其他用户对该表的所有读写操作,只有没有写锁时,其他读取的用户才能获取到锁,读锁之间不相互阻塞。

尽管存储引擎可以管理自己的锁,MySQL本身还是会使用各种有效的表锁来实现不同的目的。例如,服务器会为alter table之类的语句使用表锁,而忽略存储引擎的锁机制。

2. 行级锁

行级锁可以最大程度的支持并发处理(同时也带来了最大的锁开销)。行级锁只在存储引擎层实现。

事务

一个运行良好的事务处理系统,必须具备这些标准特征。

  • 原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务中所有操作要么全部提交成功,要么全部失败。对于一个事务,不可能只执行其中一部分操作,这就是事务的原子性
  • 一致性:数据库总是 从一个一致性状态转换到另一个一致性状态
  • 隔离性:一个事务所做的修改在最终提交以前,对其他事务是不可见得。
  • 持久性:一旦事务提交,则其所做的修改就会永久保存到数据库中。即使系统崩溃,修改的数据也不会丢失。持久性是相对的概念,不可能做到100%的持久型保证的策略。

一致性:

  1. 数据完整性:在事务执行前后,需要满足所有的规则和约束。
  2. 业务逻辑正确性:事务执行结果符合预定的业务逻辑。
  3. 状态一致性:多个事务并发执行,事务的一致性要保证并发执行的结果与这些事务按照某种顺序串行执行的结果是一样的。
  4. 持久性一致性:即使再系统发生故障后,通过恢复机制,数据库也能恢复到一个一致的状态。

隔离级别(重要)

在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两个隔离级别下工作。

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

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

相关文章

手持小风扇品牌有哪些?分享口碑最好的五款手持小风扇

手持小风扇在炎热的夏季成为了许多人解暑的好帮手。它们不仅轻便便携,随时随地都能为我们带来清凉和舒适。然而,市场上手持小风扇的品牌繁多,让人眼花缭乱。为了帮助大家做出更明智的选择,接下来我们将分享口碑最好的五款手持小风…

vscode关于java扩展

包含IDEA同款代码提示,vscode的debug,除了创建类要手动新建java文件以外,其他都还行,满足初学者要求。

Python+Pytest+Allure+Yaml接口自动化测试框架详解

PythonPytestAllureYaml接口自动化测试框架详解 编撰人:CesareCheung 更新时间:2024.06.20 一、技术栈 PythonPytestAllureYaml 版本要求:Python3.7.0,Pytest7.4.4,Allure2.18.1,PyYaml6.0 二、环境配置 1、安装python3.7,并配置…

C++编程逻辑讲解step by step:根据关键词自动判断文章的类别,去掉无关词后统计文章中每个单词出现的频率。

题目分析 根据关键词自动判断文章的类别。共2篇文章(用char s1[]和char s2[]保存),去掉无关词后(用char irrelevant[][10]保存),统计文章里面每个单词出现的频率:关键词个数去掉无关词后的文章…

前端JS必用工具【js-tool-big-box】学习,数值型数组的正向排序和倒向排序

这一小节,我们说一下前端 js-tool-big-box 这个工具库,添加的数值型数组的正向排序和倒向排序。 以前呢,我们的数组需要排序的时候,都是在项目的utils目录里,写一段公共方法,弄个冒泡排序啦,弄…

已解决java.security.GeneralSecurityException: 安全性相关的通用异常的正确解决方法,亲测有效!!!

已解决java.security.GeneralSecurityException: 安全性相关的通用异常的正确解决方法,亲测有效!!! 目录 问题分析 报错原因 解决思路 解决方法 确定具体异常类型 检查输入参数 验证算法支持性 调整安全策略 确保资源可…

uniapp 小程序 堆叠轮播图 左滑 右滑 自动翻页 点击停止自动翻页

uniapp 小程序 堆叠轮播图 左滑 右滑 自动翻页 点击停止自动翻页 超过指定时间未点击滑动 则继续开始滚动 直接上代码 componentSwiper.vue 需要注意页面切换时清除计时器 <template><view><view class"swiperPanel" touchstart"startMove"…

Verilog刷题笔记48——FSM1型异步复位

题目: 解题&#xff1a; module top_module(input clk,input areset, // Asynchronous reset to state Binput in,output out);// parameter A0, B1; reg state, next_state;always (*) begin // This is a combinational always block// State transition logiccase(…

VMware vSphere 8.0 Update 3 发布下载 - 企业级工作负载平台

VMware vSphere 8.0 Update 3 发布下载 - 企业级工作负载平台 vSphere 8.0U3 | ESXi 8.0U3 & vCenter Server 8.0U3 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&am…

【yolov8:报错AttributeError: ‘Segment‘ object has no attribute ‘detect‘】

今天在运行yolov8的Segment模式的val模型测验时报错&#xff1a; AttributeError: ‘Segment’ object has no attribute ‘detect’ 原因是yolov8的版本问题&#xff0c;更新至最新版就可以了&#xff1a; 输入ultralytics查看版本 卸载当前的老版本 然后下载最新版本就可以…

【前端】Vue项目和微信小程序生成二维码和条形码

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家分享Vue项目和微信小程序如何生成二维码和条形码&#xff0c;介绍了JsBarcode、wxbarcode等插件&#xff0c;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01…

为什么要学Java?

想要自己教会自己java&#xff0c;从小白成长到架构师。实现硬实力就业&#xff01; 因为Java是全球排名第一的编程语言&#xff0c;Java工程师也是市场需求最大的软件工程师&#xff0c;选择Java&#xff0c;就是选择了高薪。 为什么Java应用最广泛&#xff1f; 从互联网到…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP4141(SPI接口)的数字电位器Proteus仿真

一、仿真原理图: 二、运行效果: 三、软件部分: 1)、SPI读写: 2)、初始化部分: void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the CPU, AHB and APB busses clocks …

SQL连接与筛选:解析left join on和where的区别及典型案例分析

文章目录 前言数据库在运行时的执行顺序一、left join on和where条件的定义和作用left join on条件where条件 二、left join on和where条件的区别原理不同left join原理&#xff1a;where原理&#xff1a; 应用场景不同执行顺序不同&#xff08;作用阶段不同&#xff09;结果集…

Netty学习(二)——黏包半包、协议设计解析、聊天室

一、粘包与半包 1.1 粘包和半包复现 1、粘包复现&#xff1a; Server代码&#xff1a; public class ProblemServer {public static void main(String[] args) throws InterruptedException {new ServerBootstrap()//若是指定接收缓冲区大小&#xff1a;就会出现黏包、半包…

Python3 学习笔记——基本知识入门 | 菜鸟教程

Python3 学习笔记——基本知识入门 | 菜鸟教程 目录 Python3 学习笔记——基本知识入门 | 菜鸟教程基础知识标识符python保留字注释行与缩进多行语句数字(Number)类型字符串(String)空行等待用户输入同一行显示多条语句多个语句构成代码组print 输出import 与 from...import命令…

DDR3控制器(一)DDR3 IP调用

目录 一、DDR3 IP核简介 二、DDR3 IP核调用 在千兆以太网通信中用到了DDR3控制器&#xff0c;但是并没有对其做相关介绍。这次准备重新整理一下DDR3控制相关知识&#xff0c;复习巩固一下。 一、DDR3 IP核简介 MIG IP核&#xff08;Memory Interface Generator&#xff09;是…

气膜游泳馆建造成本要多少—轻空间

随着人们对健康生活的追求和游泳运动的普及&#xff0c;游泳馆的需求不断增加。传统游泳馆的建设周期长、成本高&#xff0c;而气膜游泳馆以其独特的优势成为一种新的选择。轻空间将详细分析气膜游泳馆的建造成本及其优势。 气膜游泳馆的基本结构 气膜游泳馆主要由以下几个部分…

静电场的基本方程

目录 场积分方程 通量&#xff08;高斯定理&#xff09; 环量 场微分方程 散度 旋度 小结 补充知识 立体角 场积分方程 通量&#xff08;高斯定理&#xff09; 环量 场微分方程 散度 旋度 小结 补充知识 立体角

Open3D 删除点云中重复的点

目录 一、算法原理1、重叠点2、主要函数二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、重叠点 原始点云克隆一份   构造重叠区域   合并点云获得重叠点 2、主要…