MySQL逻辑架构

1.1MySQL逻辑架构图

MySQL服务器逻辑架构图
MySQL基本架构分为三层:
(1)第一层的服务不是MySQL所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构
(2)第二层架构是MySQL的核心服务功能所在地,包括查询解析,分析,优化,缓存以及所有的内置函数,所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视图
(3)第三层包含了存储引擎。**存储引擎负责MySQL中数据的存储与提取。服务器通过API与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。存储引擎API包含几十个底层函数,存储引擎不会解析SQL,不同的存储引擎之间也不会相互通信,而只是简单地响应上层服务器的要求

1.1.1连接管理与安全性

每个客户端都会在服务器进程中创建一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行,服务器会负责缓存线程,有些也支持线程池,可以使用线程池少量的线程来服务大量的连接,当客户端连接到服务器时,服务器需要对其进行认证,认证基于用户名,原始主机信息和密码

1.1.2优化与执行

MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询,决定表的读取顺序,以及选择合适的索引等

并发控制

无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制问题。
在处理并发读或者写时,可以通过实现一个由两种类型组成的锁来解决问题,这两种类型的锁通常被称为共享锁和排他锁,也叫读锁和写锁
锁的概念是这样的:读锁是共享的,或者说是相互不堵塞的,多个客户端在同一时刻可以同时读取同一个资源,而不互相干扰。写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁

1.2.1锁粒度

一种提高共享资源并发性的方式就是让锁定对象更有选择性,尽量只锁定需要修改的部分数据,而不是所有的资源在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可
问题的关键在于加锁也需要消耗资源,锁的各种操作,包括获得锁,检查锁是否已经解除,释放锁等,都会增加系统的开销。

表锁

表锁是MySQL中最基本的锁策略,并且是开销最小的策略。表锁会锁定整张表,一个用户在对表进行写操作,需要先获得写锁,这会阻塞其他用户对该表的所有的读写操作。

行级锁,

行级锁可以最大程度地支持并发处理,同时也给带来了最大地锁开销。行级锁只在存储引擎层实现,而MySQL服务器层没有实现,服务器层完全不了解存储引擎中地锁实现。

1.3事务

事务就是一组原子性的SQL查询,或者说是一个独立的工作单元。,事务内的语句,要么全部执行成功,要么全部执行失败。
一个良好的事务处理系统必须通过严格的ACID测试,ACID表示原子性,一致性,隔离性和持久性

原子性

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对一个事务来说,不可能只执行其中的一部分,即事务的原子性体现了事务不可分隔的特点

一致性

数据库总是从一个一致性的状态转换到另外一个一致性的状态,数据库的一致性可以分为数据库外部的一致性和数据库内部的一致性:
外部的一致性:由外部编码来实现,即银行的应用在进行转账的操作时,必须在同一事务内部调用对账户A和B的操作
数据库内部的一致性:在同一个事务内部的一组操作必须全部成功或者全部失败,即事务的原子性

是不是可以这么理解一致性:完成一个事务时,事务所要实现的目标要全部完成

隔离性

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

持久性

一旦事务提交,则其所做的修改就会永久保存到数据库中

1.3.1隔离级别

SQL定义四种隔离级别
(1) READ UNCOMMITTED(未提交读)
在READ UNCOMMITTED级别中,事务中的修改,即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,也被称为脏读
(2)READ COMMITTED(提交读)
大多数数据库系统的默认隔离级别都是READ COMMITTED(但MySQL不是),这个级别能满足隔离性的简单定义:一个事务开始时,只能看到已经提交的事务所做的修改,READ COMMITTED也别乘坐不可重复读,因为相同的查询,也有可能会得到不同的结果
(3)REPEATABLE READ(可重复读)
该级别保证了在同一个事务中多次读取同样的记录的结果是一致的。但是可重复读还是无法解决幻读的问题,所谓的幻读,就是指当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行
可重复读是MySQL的默认事务隔离级别
(4)SERIALIZABLE(可串性化)
该级别是最高的隔离级别,它通过强制事务串行执行,简单来说,SERIALIZABLE会读取的每一行数据上都加锁,所以可能会导致大量的超时和锁争用的问题

隔离级别脏读可能性不可重复读可能性幻读可能性加锁性
READ UNCOMMITTEDYESYESYESNO
READ COMMITTEDNOYESYESNO
REPEATABLE READNONOYESNO
SERIALIZABLENONONOYES

总结:脏读就是读取了未提交的数据,不可重复读就是读取了提交了的数据,幻读就是读取了提交的数据和自己提交的数据有所差别
这里在说一下不可重复读和幻读的区别:不可重复读是指两次读取同一个数据,两次的结果都不一样,幻读是指事务在插入或者删除已经检查过不存在的记录时,发现这些数据已经存在或者消失了,之前的检测犹如幻觉一样

1.3.2死锁

死锁是指两个或者多个事务在同一资源上相互利用,并请求锁定对方占用的资源,从而导致恶性循环的现象,就是谁也得不到资源,一直空等待

1.3.3MYSQL中的事务日志

Alt
mySQL采用默认采用自动提交模式,也就是说,如果不是显示地开始一个事务,那么每个查询都被当做一个事务执行提交操作
MySQL可以通过设置执行SET TRANSACTION ISOLATION LEVEL命令来设置隔离级别,新的隔离级别会在下一个事务开始地时候生效。

1.5MySQL中地搜索引擎

可以使用SHOW TABLE STATUS LIKE ‘表名’ \G来查看表地相关信息
Alt

先展示下效果 https://pan.quark.cn/s/e81b877737c1 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 执行环境,它使开发者能够在服务器端执行 JavaScript 编程,显著促进了全栈开发的应用普及。 在 Node.js 的开发流程中,`node_modules` 文件夹用于存储所有依赖的模块,随着项目的进展,该文件夹可能会变得异常庞大,其中包含了众多可能已不再需要的文件和文件夹,这不仅会消耗大量的硬盘空间,还可能减慢项目的加载时间。 `ModClean 2.0` 正是为了应对这一挑战而设计的工具。 `ModClean` 是一款用于清理 `node_modules` 的软件,其核心功能是移除那些不再被使用的文件和文件夹,从而确保项目的整洁性和运行效率。 `ModClean 2.0` 是此工具的改进版本,在原有功能上增加了更多特性,从而提高了清理工作的效率和精确度。 在 `ModClean 2.0` 中,用户可以设置清理规则,例如排除特定的模块或文件类型,以防止误删重要文件。 该工具通常会保留项目所依赖的核心模块,但会移除测试、文档、示例代码等非运行时必需的部分。 通过这种方式,`ModClean` 能够协助开发者优化项目结构,减少不必要的依赖,加快项目的构建速度。 使用 `ModClean` 的步骤大致如下:1. 需要先安装 `ModClean`,在项目的根目录中执行以下命令: ``` npm install modclean -g ```2. 创建配置文件 `.modcleanrc.json` 或 `.modcleanrc.js`,设定希望清理的规则。 比如,可能需要忽略 `LICENSE` 文件或整个 `docs`...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值