MySQL (一)MySQL架构

本文详细介绍了MySQL的逻辑架构,重点讨论了并发控制机制,包括共享锁和排他锁,以及表锁和行级锁的策略。还深入探讨了事务的ACID属性、四种隔离级别以及死锁处理。此外,解释了事务日志如何提高效率,并介绍了InnoDB存储引擎的MVCC实现。最后,概述了MySQL的主要存储引擎,如InnoDB和MyISAM的特点与适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. MySQL逻辑架构如图所示:

2. 并发控制

多个查询同时在同一时刻修改数据就会产生并发控制问题。在邮箱投递问题中(两个进程同一时刻对同一个邮箱进行投递,读邮件和删邮件同时发生等),通过实现一个由两种类型的锁组成的锁系统来解决问题——共享锁(读锁)和排他锁(写锁)。用户在修改数据时,MySQL会通过锁来防止其他用户读取同一数据。

2.1 锁粒度

一种提高共享资源并发性的方式就是让锁对象更有选择性。所谓的锁策略就是在数据的安全性和开销上追求一个平衡,一般都是在表上施加表锁和行级锁。

表锁:最基本的锁策略,开销最小:他会锁定整张表,用户在对表进行增删改查时,需要先获得写锁,这会阻塞其他用户对该表的读写操作,直到写锁消失,读锁之间时不相互阻塞的。写锁的优先级比读锁更高。

行级锁:最大程度支持并发处理,开销也最大。只在存储引擎层实现。存储引擎都以自己的方式显现了锁机制。

2.2 事务

事务就是一组原子性的SQL查询,或者说一个独立的单元,事务内的语句要么全部执行,要么全部失败(比如说银行转账这次事务中的语句有:检查金额,某某减去,某某增加)。

事务需要通过严格的ACID测试。

ACID:atomicity,consistency,isolation,durability

MySQL的存储引擎架构的优势之一就是可以让用户根据业务是否需要事务处理,来选择合适的存储引擎。

2.2.1隔离级别

SQL中定义了四种隔离级别,每一个级别都规定了一个事务中所做的修改,有关事务内、间的可见性,级别越低可以执行更高的并发,开销也越低。

1.READ UNCOMMITED未提交读:事务1修改了数据A后未提交,事务2可以读到被事务1修改的数据A,但是事务1可能最终不提交,那么事务2读到的就是错误的数据(脏数据)

2.READ COMMITED提交读:事务1读取了数据A后未提交,事务2修改了数据A且提交,然后事务1再去读数据A会发现前后两次读结果不同,这就是不可重复读(因为重复读结果不一样)

3.REAPATABLE READ可重复读:事务1读取了数据A后未提交,事务2修改了数据A且提交,然后事务1再去读数据A会发现前后两次读结果相同,这就是可重复读 -- MYSQL默认级别

4.SERIALIZABLE可串行化:级别最高,每一行数据加锁,导致所有事务都必须串行执行,但是代价很大

脏读:事务内修改的数据在未提交时对外可见,(2)(3)(4)解决该问题

不可重复读:事务内相同数据的读结果不一致,(3)(4)解决该问题

幻读:事务1读取了范围A-范围B的数据且未提交,事务2在A-B之间插入新的一行数据后提交,事务1再去读取会发现多了一行数据,就像幻觉一样,只有(4)与MVCC多版本并发控制解决

2.2.2死锁

两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时或多个事务同时锁定同一个资源时会产生死锁。应用程序在设计时必须要考虑死锁,大多数情况下,只需要重新执行因死锁回滚(才能打破死锁)的事务即可。

2.2.3事务日志

提高事务的效率,存储引擎在修改表的数据时只需要修改其内存拷贝,再把修改的行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。

2.2.4MySQL中的事务

MySQL提供两种事务型的存储引擎:InnoDBNDB Cluster

MySQL默认采用自动提交(AUTOCOMMIT模式,如果不是显示地开始一个事务,则每个查询都被当做时一个事务执行提交操作。在当前连接中,可以通过设置AUTOCOMMIT变量来启动或禁用该模式(非事务型表无影响)。

MySQL通过执行SET   TRANSACTION   ISOLATION   LEVEL命令来设置隔离级别,在下一个事务开始时生效。

MySQL服务层不管理事务,由下层地存储引擎实现,所以使用多种存储引擎是不可靠的。

InnoDB采用两阶段锁定协议,事务执行中随时都可以执行锁定,锁只有在执行COMMIT或ROLLBACK时才释放(同一时刻释放的)。InnoDB会根据隔离级别在需要的时候自动枷锁,这些都是隐式锁。通过语句进行的显式锁也被支持,但这些语句不属于SQL规范。

MySQL事务主要用到两个关键字 COMMIT 与 ROLLBACK

成功完成一个事务后,就会执行 COMMIT 命令,从而使施加于所涉及的表上的改变生效。如果事务失败,就会执行 ROLLBACK 命令,将事务中所引用的每一个表都回撤到之前的状态。

在MySQL中,当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。则会发生转换隐式。

3. 多版本并发控制(MVCC)

MVCC是行级锁的一个变种,在很多情况下避免了加锁操作,开销很低,实现机制虽然不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。

MVCC是通过保存数据在某个时间点的快照实现的。

MVCC没有统一的实现标准(不同的存储引擎),典型的有乐观并发控制和悲观并发控制。

InnoDB的MVCC是通过在每行记录后面保存两个隐藏的列(分别保存行的创建时间和过期时间)来实现的。

4. MySQL的存储引擎(概要)

在文件系统中,MySQL将每个数据库(schema)保存为数据目录下的一个子目录。创建表时,MySQL会在数据库子目录下创建一个和表同名的.frm文件保存表的定义(服务层统一处理)。

可以使用SHOW TABLE STATUS 命令显示表的相关信息。

4.1InnoDB存储引擎

MySQL默认的最重要,应用最广泛的事务型存储引擎。用来处理短期事务(很少被回滚)

提一下回滚:即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,滚回到事务开始时的状态。

InnoDB存储在表空间中,采用MVCC支持高并发,实现四个隔离级别,表基于聚簇索引建立。

4.2 MyISAM存储引擎 

MySQL5.1之前的默认存储引擎。提供全文索引,压缩,空间函数等大量特性,不支持事务和行级锁,崩溃后无法安全恢复。所以只有在只读数据,表比较小,可以忍受repair操作中有一定的用处,因为该引擎设计简单,数据以紧密格式存储,性能很好。压缩表可以可以极大减少磁盘空间占用,减少磁盘I/O(解压的开销小于I/O的开销)。

4.3MySQL内建的其他存储引擎

Archive引擎

Blackhole引擎

CSV引擎

Federated引擎

Memory引擎

Merge引擎

NDB集群引擎

4.4 选择合适的引擎

InnoDB YYDS,除非需要用到InnoDB没有的特性。

主要根据事务、备份、特有的特性这几个因素来考虑。

4.5 转换表的引擎(主要有以下三种方法)

1.ALTER TABLE 语句

该语句使用任何引擎,但是执行时间很长。

 2.导出与导入

 使用mysqldump工具将数据导出到文件,然后修改文件中CREATE TABLE语句的存储引擎选项,同时要修改表名(一个数据库中的表名不能重复)

3.创建与查询

 综合了1的安全和2的高效,不需要导出整个表二点数据,先创建一个新的存储引擎表,利用INSERT......SELECT语法来导出数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值