「高性能MySQL」读书笔记(1)- MySQL架构

news2024/11/14 17:24:24

一、前言

本系列主要是记录阅读「高性能MySQL」期间笔记,记录在日常使用中忽略的知识、模糊的点,主要面对有一定MySQL使用经验的开发者。

本文是针对于MySQL一些基础定义的解释说明,会非常浅显通俗易懂。

二、MySQL的逻辑架构

简单梳理MySQL的结构,大致分为三部分。

第一层客户端。包括连接处理、身份验证、确保安全性等。

第二层MySQL的核心功能,包括查询解析、分析、优化、以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能也都在这一层实现:存储过程、触发器、视图等。

第三层是存储引擎层。存储引擎负责MySQL中数据的存储和提取。

在这里插入图片描述

三、并发控制

两个级别的并发控制:服务器级别和存储引擎级别。

服务器级别的并发:同时执行的客户端连接数。
存储引擎并发:在MySQL服务器中使用不同类型的存储引擎时,多个连接可以同时访问和修改表数据的能力。每种存储引擎都有不同的并发访问约束和实现方式。例如,InnoDB 存储引擎支持行级锁定和 MVCC 特性来提供高度的并发性能,而 MyISAM 存储引擎则以表级锁定为特征,限制了同时访问同一张表的连接数量。

锁类型

并发的解决方案也是比较简单的,通过加锁处理,有两种锁共享锁(shared lock)和排他锁(exclusive lock),也叫读锁(read lock)和写锁(write lock)。

对同资源来说,读锁之间互不阻塞,互不干扰。写锁是排他的,一个写锁既会阻塞读锁也会阻塞其他的写锁,并防止其他客户端读取正在写入的资源。

当客户端想对表进行写操作(插入、删除、更新等)时,需要先获得一个写锁,这会阻塞其他客户端对该表的所有读写操作。只有没有人执行写操作时,其他读取的客户端才能获得读锁,读锁之间不会相互阻塞。

锁粒度

每种MySQL存储引擎都可以实现自己的锁策略和锁粒度。

锁粒度与并发量:锁粒度越小(锁得更精确)↓ 并发量越高↑
锁粒度与资源消耗量:锁粒度越小(锁得更精确)↓ 资源消耗量越大↑

理论上锁的足够精确,并发量能够达到极致,但这并不能很好的在实际生产中应用,大多都使用的是行级锁(row level lock)。除了行锁外,还有另外一种表锁(table lock)

四、事务

ACID事务

谈到事务不得不提起ACID事务。ACID代表原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。

原子性(atomicity)

一个事务必须被视为一个不可分割的工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。

一致性(consistency)

数据库总是从一个一致性状态转换到下一个一致性状态。一个分为多步骤的操作,即使最后步骤出现了错误,最后事务没有提交,该事务的数据修改也不会保存到数据库中。

隔离性(isolation)

通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的,这就是隔离性带来的结果。

持久性(durability)

一旦提交,事务所做的修改就会被永久保存到数据库中。此时即使系统崩溃,数据也不会丢失。

隔离级别

READ UNCOMMITTED(未提交读)

在READ UNCOMMITTED级别,在事务中可以查看其他事务中还没有提交的修改。这个隔离级别会导致很多问题,从性能上来说,READ UNCOMMITTED不会比其他级别好太多,却缺乏其他级别的很多好处,除非有非常必要的理由,在实际应用中一般很少使用。

读取未提交的数据,也称为脏读(dirty read)

READ COMMITTED(提交读)

大多数数据库系统的默认隔离级别是READ COMMITTED(但MySQL不是)。READ COMMITTED满足前面提到的隔离性的简单定义:一个事务可以看到其他事务在它开始之后提交的修改,但在该事务提交之前,其所做的任何修改对其他事务都是不可见的。这个级别仍然允许不可重复读(nonrepeatable read),这意味着同一事务中两次执行相同语句,可能会看到不同的数据结果。

REPEATABLE READ(可重复读)

REPEATABLE READ解决了READ COMMITTED级别的不可重复读问题,保证了在同一个事务中多次读取相同行数据的结果是一样的。但是理论上,可重复读隔离级别还是无法解决另外一个幻读(phantom read)的问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(phantom row)。InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)解决了幻读的问题。本章稍后会对此做进一步讨论。

REPEATABLE READ是MySQL默认的事务隔离级别

SERIALIZABLE(可串行化)

SERIALIZABLE是最高的隔离级别。该级别通过强制事务按序执行,使不同事务之间不可能产生冲突,从而解决了前面说的幻读问题。简单来说,SERIALIZABLE会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。实际应用中很少用到这个隔离级别,除非需要严格确保数据安全且可以接受并发性能下降的结果。

ps:脏读和幻读

脏读(Dirty Read)指一个事务读取到了另一个事务尚未提交的数据,也就是读取了尚未稳定下来的数据。

而幻读(Phantom Read)则是指在一个事务执行期间,某个查询操作返回了满足搜索条件的一组行,但是这些行却因为其他事务的插入或删除操作,使得同样的查询操作返回了不同的结果集,这就好像发生了幻觉一样。

本质区别,脏读描述的是读取到未提交的数据,而幻读描述的是在同一个事务中,前后两次读取同一结果集时返回的结果不同

隔离级别脏读 (Dirty Read)幻读 (Phantom Read)
READ UNCOMMITTED可能出现可能出现
READ COMMITTED不会出现可能出现
REPEATABLE READ不会出现不会出现
SERIALIZABLE不会出现不会出现

五、死锁

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

六、隐式锁定和显式锁定

InnoDB使用两阶段锁定协议(two-phase locking protocol)。在事务执行期间,随时都可以获取锁,但锁只有在提交或回滚后才会释放,并且所有的锁会同时释放。前面描述的锁定机制都是隐式的。InnoDB会根据隔离级别自动处理锁。

两阶段锁定协议 后续补充

七、多版本并发控制

MVCC

虽说是行级锁,但是并不是简单的行锁,是一种给予MVCC机制的实现方式,MVCC是一个理论机制,不同的数据库进而进行实现。

MVCC的实现方式是为每个数据行(记录)维护一个或多个版本。每个事务读取数据时,将能够看到与其事务启动时间相关的那些版本,而写操作将创建新的版本。这样就可以在多个事务同时读取和修改数据时,保证每个事务读取到的都是自己所需要的版本,从而避免了锁定竞争和阻塞等情况的发生。

InnoDB的实现

InnoDB是通过给每个事务分配一个唯一的编号(即事务ID)来实现MVCC的。这个编号在事务第一次读取数据时就会被分配。当事务修改一条记录时,它会先在Undo日志中写入一条记录,描述如何撤销该修改操作,并且指明回滚该操作的位置。

当不同的用户想读取聚簇主键索引记录时,InnoDB会检查该记录的事务ID和用户所处的读取视图对比,如果该记录不应该在当前状态下可见(即被尚未提交的事务更改过),那么就会查找并应用Undo日志直到找到符合条件的事务ID,或者删除所有与该行有关的Undo记录,然后向用户表明该行不存在。这个过程会一直循环,直至找到满足条件的Undo记录或者没有记录为止,从而保证每个用户都能看到符合自己事务读取时的最新版本的数据。

![[Pasted image 20230509101151.png]]

八、InnoDB

提起MySQL不得不说InnoDB。InnoDB是MySQL的默认事务型存储引擎,也是最重要、使用最广泛的引擎。

InnoDB是MySQL默认的通用存储引擎。默认情况下,InnoDB将数据存储在一系列的数据文件中,这些文件统被称为表空间(tablespace)。表空间本质上是一个由InnoDB自己管理的黑盒。

InnoDB使用MVCC来实现高并发性,并实现了所有4个SQL标准隔离级别。InnoDB默认为REPEATABLE READ隔离级别,并且通过间隙锁(next-key locking)策略来防止在这个隔离级别上的幻读:InnoDB不只锁定在查询中涉及的行,还会对索引结构中的间隙进行锁定,以防止幻行被插入。

InnoDB表是基于聚簇索引构建的,聚簇索引提供了非常快速的主键查找。但是,因为二级索引(secondary index,非主键索引)需要包含主键列,如果主键较大,则其他索引也会很大。如果表中的索引较多,主键应当尽量小。

InnoDB内部做了很多优化。其中包括从磁盘预取数据的可预测性预读、能够自动在内存中构建哈希索引以进行快速查找的自适应哈希索引(adaptive hash index),以及用于加速插入操作的插入缓冲区(insert buffer)。我们将在本书第4章讨论这些内容。

九、小结

MySQL拥有分层的架构,上层是服务器级别的服务和查询执行层,下层则是存储引擎。虽然有很多不同作用的插件API,但存储引擎API是最重要的。MySQL通过API来与存储引擎交互需要处理的数据行,理解了这一点,就掌握了MySQL服务器架构的基本原理。

在过去的几个主要版本中,MySQL主要的改进核心在于InnoDB的演进。表元数据、用户认证、身份鉴权这些内部统计信息的管理也已经调整为使用InnoDB表来实现,而在几年前,使用的都是MyISAM引擎。Oracle官方在InnoDB引擎上加大了投入,这使得MySQL有了一些重大改进,例如原子DDL,更完善的online DDL,更强大的崩溃恢复能力,以及更安全的部署操作。

InnoDB是MySQL的默认存储引擎,它几乎能覆盖每一种使用场景。后面的章节我们将重点介绍InnoDB存储引擎,包括它的特性、性能及限制。从现在开始,我们将很少提到InnoDB以外的其他存储引擎了。

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

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

相关文章

PCL学习九:Registration-配准

参考引用 Point Cloud Library黑马机器人 | PCL-3D点云 1. 点云中的数学 函数求导 对于函数 f ( x ) x 2 f(x)x^2 f(x)x2 其一阶导数也是 x x x 的函数: d f d x 2 x \frac{df}{dx}2x dxdf​2x其二阶导为常数,与 x x x 无关: d 2 f d x…

【漏洞分析】CVE-2021-0920 Linux内核垃圾回收机制中的竞争UAF漏洞

漏洞发现:该漏洞早在2016年被 RedHat 内核开发人员发现并披露,但 Linux 内核社区直到 2021 年重新报告后才对该漏洞进行修补(patch)。Google的威胁分析小组(Threat Analysis Group)发现该漏洞在野外被使用&…

shell脚本----基础命令

文章目录 一、sort命令二、uniq命令三、 tr命令四、cut命令 一、sort命令 sort命令以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序,比较的原则是从首字符向后,一次按ASCII码的值进行比较,最后按序输出。 ASCII码…

【P17】JMeter 边界提取器(Boundary Extractor)

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜: http://111.231.103.117/#/login 进入网页后,登录,页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12,打开调试工具,点击搜索 二、测试计划设…

详细版易学版TypeScript - 元组 枚举

一、元组(Tuple) 数组:合并了相同类型的对象 const myArr: Array<number> [1, 2, 3]; 元组(Tuple):合并了不同类型的对象 // 定义元组时就要确定好数据的类型&#xff0c;并一一对应 const tuple: [number, string] [12, "hi"]; // 添加内容时&#xff0c;不…

SQLIST数据库编程

目录 数据库简介 1.常用数据库 2. SQLite基础 3.创建SQLite数据库 虚拟中sqlite3安装 基础SQL语句使用 sqlite3编程 数据库简介 1.常用数据库 大型数据库 &#xff1a;Oracle 中型数据库 &#xff1a;Server是微软开发的数据库产品&#xff0c;主要支持windows平台 小型数据库…

( 位运算 ) 190. 颠倒二进制位 ——【Leetcode每日一题】

❓190. 颠倒二进制位 难度&#xff1a;简单 颠倒给定的 32 位无符号整数的二进制位。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中&#xff0c;没有无符号整数类型。在这种情况下&#xff0c;输入和输出都将被指定为有符号整数类型&a…

Vue.js自定义指令及用Vue实现简单的学生信息管理系统

目录 一、自定义指令v-mycolor 自定义指令生命周期&#xff1a; 二、使用钩子函数的自定义指令 三、Vue实现简单的学生信息管理系统 除了核心功能默认内置的指令&#xff0c;Vue.js允许注册自定义指令。添加一个自定义指令&#xff0c;有两种方式&#xff1a; &#xff08;1…

Redis 常见命令

一、redis中的常见数据结构 Redis共有5种常见数据结构&#xff0c;分别字符串&#xff08;STRING)、列表&#xff08;LIST&#xff09;、集合&#xff08;SET)、散列&#xff08;HASH&#xff09;、有序集合&#xff08;ZSET)。 二、redis中字符串(String)介绍 String 类型是…

PS网页版设计工具有哪些?

Photoshop是平面设计领域的老熟人&#xff0c;也是许多设计师的启蒙设计软件。然而&#xff0c;Photoshop的功能繁多&#xff0c;需要设计师具备较强的软件操作能力。在我们以为会和Photoshop一直相爱相杀的时候&#xff0c;一款专注于用户界面的矢量设计软件——即时设计&…

荔枝派Zero(全志V3S)驱动开发之RGB LCD屏幕显示jpg图片

文章目录 前言一、jpeglib 库移植1、jpeglib 库下载2、安装 jpeglib 库 二、jpeg 图片解压缩过程和压缩过程1、jpeg 解压缩过程2、jpeg 压缩过程 三、编译 C 源码1、源码展示2、拷贝需要用到的头文件3、编译 C 代码 四、验证测试1、拷贝相关文件到开发板2、显示图片 前言 由于…

深入了解Dubbo SPI 工作机制——@Adaptive(6)

Adaptive这个注解就是适配策略&#xff0c;我都是称呼为最佳适配子类&#xff0c;或者最佳适配类。就是找到最佳的子实现类的&#xff0c;其实就是默认的类。这个注解可以打在类上方&#xff0c;那么dubbo SPI机制通过接口获取实例类&#xff0c;就是获取到有Adaptive注解的实现…

WooCommerce商城开发:高性能订单存储数据库模式

这是一系列深入探讨的第一部分&#xff0c;专门用于解释高性能订单存储数据库模式的实施。 与1 月份提出的版本相比&#xff0c;数据库模式的变化很小。我们在不同的地方添加和删除了几列&#xff0c;但整体表结构与第一个提案中描述的相同&#xff1a; 我们在此项目中添加了4…

51单片机(九)LED点阵屏

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

创维E900-S-Hi3798MV100-当贝纯净桌面-卡刷固件包

创维E900-S-Hi3798MV100-当贝纯净桌面-卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xff0…

RabbitMQ消息队列实战(5)—— 发后即忘和远程RPC数据传输模型

本文我们学习下使用RabbitMQ实现的几种数据发送的模型——发后即忘模型和远程RPC调用。二者实际上是从业务的角度定义的一个RabbitMQ的使用模型。发后即忘模型&#xff0c;强调发送时不太关心消息接收者的执行结果&#xff0c;仅仅是为了发送信息。而远程RPC调用模型强调&#…

vulnhub靶场之double:1

1.信息收集 探测存活主机&#xff0c;发现192.168.239.178存活 对目标主机192.168.239.176进行端口扫描&#xff0c;发现存活22(SSH)、25(smtp)、80、8080端口。 浏览器访问http://192.168.239.178&#xff0c;发现有两个链接。查看源码发现一个是跳转到/production&#xf…

David Silver Lecture 6: Value function approximation

1 Introduction pipeline大致讲完了&#xff0c;开始到数值计算的部分。 1.1 大规模的运算 对于这种大规模运算&#xff0c;如何拓展前面两个章节的内容&#xff0c;进行实战。 1.1.1 回顾value function approximation 1.1.3 which function approximator 强化学习中的值函…

java源码----集合系列1----ArrayList,linkedList

Arraylist 基础信息 底层是一个object数组 Arraylist 是java里面Collection 标准的一个集合&#xff0c;其底层是一个object数组。当new一个空参的ArrayList的时候&#xff0c;会默认生成一个空数组。 Arraylist上限是 Integer.MAX_VALUE - 8(Integer.MAX_VALUE 2^31-1);…

一文搞定接口测试及常用接口测试工具解析

目录 首先&#xff0c;什么是接口呢&#xff1f; 一、常见接口&#xff1a; 二、前端和后端&#xff1a; 三、什么是接口测试&#xff1a; 四、接口组成 五、为什么要做接口测试&#xff1a; 六、接口测试怎么测&#xff1a; 七、用什么工具测 首先&#xff0c;什么是接…