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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE进阶】Spring AOP使用篇

目录 1.AOP概述 2.SpringAOP快速入门 2.1 引入AOP依赖 2.2 编写AOP程序 3. Spring AOP详解 3.1 Spring AOP 核心概念 3.1.1切点(Pointcut) 3.1.2 连接点 (Join Point) 3.1.3 通知(Advice) 3.1.4 切面(Aspect) 3.2 通知类型 3.3PointCut 3.4 切面优先级 3.5 切点表…

经典神经网络(13)GPT-1、GPT-2原理及nanoGPT源码分析(GPT-2)

经典神经网络(13)GPT-1、GPT-2原理及nanoGPT源码分析(GPT-2) 2022 年 11 月,ChatGPT 成功面世,成为历史上用户增长最快的消费者应用。与 Google、FaceBook等公司不同,OpenAI 从初代模型 GPT-1 开始,始终贯彻只有解码器&#xff0…

安卓webview内h5页面调用录音设置

h5页面调用录音接口getUserMeia在webview中有可能不成功,进入错误回调,这个时候webview尽可能设置下面这些权限就会好。

Linux系统编程(七)进程间通信IPC

进程间通讯的7种方式_进程间通信的几种方法-CSDN博客 管道 pipe(命名管道和匿名管道);信号 signal;共享内存;消息队列;信号量 semaphore;套接字 socket; 1. 管道 内核提供&#x…

华为云安全防护,九河云综合分解优劣势分析

随着全球化的发展,越来越多的企业开始寻求在国际市场上扩展业务,这一趋势被称为企业出海。然而,企业在海外扩张面临诸多隐患与安全挑战,其中因为地域的不同,在安全性方面与国内相比会变得薄弱,从而导致被黑…

展开说说:Android列表之RecyclerView

RecyclerView 它是从Android5.0出现的全新列表组件,更加强大和灵活。用于显示列表形式 (list) 或者网格形式 (grid) 的数据,替代ListView和GridView成为Android主流的列表组件。可以说Android客户端只要有表格的地方就有RecyclerView。 RecyclerView 内…

无痛接入FastText算法进行文本分类(附代码)

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享,包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

未来已来,如何打造智慧养殖场?

近年来,国家出台了一系列扶持政策,以促进养殖行业高质量发展,推动行业转型升级。在国家政策和市场需求的双重驱动下,养殖行业正迎来前所未有的发展机遇。智慧养殖以其高效、智能和可持续的特点,正逐步取代传统养殖方式…

【消息队列】RabbitMQ集群原理与搭建

目录 前言1、集群搭建1.1、安装RabbitMQ1.1.1、前置要求1.1.2、安装Erlang环境①创建yum库配置文件②加入配置内容③更新yum库④正式安装Erlang 1.1.3、安装RabbitMQ1.1.4、RabbitMQ基础配置1.1.5、收尾工作 1.2、克隆VMWare虚拟机1.2.1、目标1.2.2、克隆虚拟机1.2.3、给新机设…

涉案财物管理系统|DW-S405系统实现涉案财物科学化管理

随着社会的不断发展,犯罪形式日益复杂,涉案财物的种类和数量也不断增加。传统的涉案财物管理方式已经无法满足现代执法办案的需求。因此,建立一套科学、高效、规范的警用涉案财物管理系统成为公安机关亟待解决的问题。 涉案财物管理系统DW-S…

哈希表 | 哈希查找 | 哈希函数 | 数据结构 | 大话数据结构 | Java

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 📌毛毛张今天分享的内容🖆是数据结构中的哈希表,毛毛张主要是依据《大话数据结构📖》的内容来进行整理,不…

vue的学习--day2

如有错误,烦请指正~ 目录 一、什么是单页面应用程序 二、使用工具:node.js 三、工具链 易错点 一、什么是单页面应用程序 多个组件(例如登录、注册等以vue结尾的都叫做组件)在一个页面显示,叫单页面应用…

Linux C 程序 【02】创建线程

1.开发背景 上一个篇章,基于 RK3568 平台的基础上,运行了最简单的程序,然而我们使用了 Linux 系统,系统自带的多线程特性还是比较重要的,这个篇章主要描述线程的创建。 2.开发需求 设计实验: 创建一个线程…

极验行为式验证码适配HarmonyOS 鸿蒙SDK下载

现阶段,越来越多的开发者正在积极加入鸿蒙生态系统。随着更多开发者的参与,早在去年9月,极验就成为首批拥有鸿蒙NEXT内测版本和手机系统测试机会的验证码供应商。 为了提高各开发者及企业客户集成鸿蒙版本行为验4.0的效率,方便大家…

Android 通知组

一. 通知组简介 从 Android 7.0(API 级别 24)开始,您可以在一个组中显示相关通知。如下所示: 图 1. 收起(顶部)和展开(底部)的通知组。 注意 :如果应用发出 4 条或更多条通知且未…

大数据平台需要存算分离吗?某保险集团:以 ZBS 优化资源利用率,缩短业务用时超一半

金融机构普遍采用“存算一体”架构支撑基于 Hadoop 框架的大数据平台。而随着金融业务的多元化发展,不同业务对计算和存储的需求差异较大,由于“存算一体”架构共享存储与计算资源,经常会出现资源需求不均衡、资源利用率低下、难以灵活调度等…

工具篇:鸿蒙DevEco Studio5.0版本下载及安装

1、下载中心地址 下载中心 | 华为开发者联盟-HarmonyOS开发者官网,共建鸿蒙生态 2、安装 DevEco Studio支持Windows和macOS系统,下面将针对两种操作系统的软件安装方式分别进行介绍。 Windows环境 运行环境要求 为保证DevEco Studio正常运行&#…

Mysql需要知道的点

目录 一、数据库的三范式是什么 二、Mysql数据库引擎有哪些 三、说说Innodb与MYISAM的区别 四、数据库的事务 五、索引是什么 六、优化手段有哪些 七、简单说一说 drop,delete与truncate的区别 八、什么是视图 九、什么是内连接、左外连接、右外连接&#x…

Ubuntu20.04使用Samba

目录 一、Samba介绍 Samba 的主要功能 二、启动samba 三、主机操作 四、Ubuntu与windows系统中文件互联 五、修改samba路径 一、Samba介绍 Samba 是一个开源软件套件,用于在 Linux 和 Unix 系统上实现 SMB(Server Message Block)协议…

[行业原型] Web端原型案例:康欣医疗后台管理系统

​医疗管理系统是一个业务复杂,功能庞大的系统,以下为HIS医院管理系统的常见模块,供大家参考。 本周为大家带来Web端原型案例:康欣医疗后台管理系统,先上原型: 完整文档加班主任微信号 添加班主任回复 “1…