MySql 的基础架构
说说 MySQL 的架构?
面试官一般不会直接问你 MySQL 基础架构,通常会由“一个 SQL 语句在 MySQL 中的执行流程”类似的问题引出。
连接器
用于身份验证和权限认证,主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作。如果身份验证通过,就可以进入下一步。
查询缓存
在 MySql 8.0 以后就已经被删除。如果在缓存中命中,那么直接返回结果。如果没有进入分析器。
分析器
说白了分析器就是检查你这个语句要干嘛的,语句有没有错误的。
所以分成两步:
词法分析:提取关键字,例如select,再提取要查询的表,等待这些步骤。
语法分析:检查这个 Sql 中有没有错误。
优化器
将 Sql 按照他认为最优的方式去执行。例如多个索引的情况,应该优先用哪个索引。
执行器
操作引擎,返回结果。
执行前会校验该用户有没有权限,如果没有权限,就会返回错误信息,如果有权限,就会去调用引擎的接口,返回接口执行的结果。
Sql 的执行过程
Sql 的执行过程基本上就按照上述的过程来走。但是如果对数据库进行修改的话,需要记录日志。
update tb_student A set A.age='19' where A.name=' 张三 ';
以上述 sql 为例,
-
如果命中缓存,会用到缓存。
-
拿到这个sql 语句后,将 age 改为 19,然后调用 InnoDB 引擎的 API 接口,然后将数据存储到内存中,同时记录 redo log,此时redo log 进入 prepare 状态然后告诉执行器,完成了。
-
执行器接到通知后,记录 binlog,然后调用引擎接口,提交 redo log 为提交状态。
为什么要两个日志模块?
因为 InnoDB 不是 MySql 本身就有的,如果不用 redo log 就失去了 如果数据库发生异常重启,之前提交的记录都不会丢失 的能力。而 binlog 只能用来归档。所以需要两个日志模块。
InnoDB 的优点有哪些?
这个问题一般也是和其他引擎的区别。
从是否支持事务,行级锁,外键,崩溃恢复,mvcc 多个角度回答。
-
事务:InnoDB 支持事务。
-
行级锁:InnoDB 支持行级锁,这也保证了 MySql 可以在并发的环境下减少锁冲突。
-
外键约束:InnoDB 支持外键,可以将多个表连接在一起。
-
崩溃恢复:InnoDB 可以进行崩溃恢复,可以利用日志实现。
-
mvcc :多版本并发控制。
mvcc
MVCC,即Multi-Version Concurrency Control (多版本并发控制)。它是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
基于什么实现:
-
事务版本号
-
隐式字段
-
undo log 回滚日志
-
版本链:多个事务并行操作某一行数据时,不同事务对该行数据的修改会产生多个版本,然后通过回滚指针(roll_pointer),连成一个链表,这个链表就称为版本链。
-
快照读和普通读
-
Read View : 是一个视图,Sql 执行语句时,产生的读视图,做可见性判断的。
快照读(Snapshot Read)
-
定义:快照读是指事务在读取数据时,看到的是事务开始时的一个数据快照,即事务开始那一刻数据库的状态。这意味着,即使其他事务在快照读之后修改了数据,当前事务也不会看到这些修改,直到它自己的隔离级别允许它看到。
-
特点:
-
不会加锁,因此不会阻塞其他事务的写操作。
-
通常与多版本并发控制(MVCC)机制结合使用,以实现较高的并发性能。
-
在某些隔离级别下(如可重复读或快照隔离),同一个事务中的多次快照读会看到相同的数据快照。
-
-
应用场景:适用于读取操作频繁,且对数据一致性要求不是特别严格的场景。
当前读(Current Read)
-
定义:当前读是指事务在读取数据时,看到的是数据库的最新数据状态。这意味着,当前读会看到所有已经提交的事务对数据的修改。
-
特点:
-
可能会加锁,以确保读取的数据是最新的,并且不会被其他事务修改。
-
在某些隔离级别下(如读已提交或序列化),当前读可能会导致锁冲突,从而影响并发性能。
-
同一个事务中的多次当前读可能会看到不同的数据状态,因为它们反映的是数据库的最新状态。
-
-
应用场景:适用于对数据一致性要求非常严格的场景,或者在需要确保读取的数据是最新状态的情况下。
查询一条记录,基于MVCC,是怎样的流程
-
获取事务自己的版本号,即事务ID
-
获取Read View
-
查询得到的数据,然后Read View中的事务版本号进行比较。
-
如果不符合Read View的可见性规则, 即就需要Undo log中历史快照;
-
最后返回符合规则的数据
总结
-
MySQL 主要分为 Server 层和引擎层,Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,同时还有一个日志模块(binlog),这个日志模块所有执行引擎都可以共用,redolog 只有 InnoDB 有。
-
引擎层是插件式的,目前主要包括,MyISAM,InnoDB,Memory 等。(存储架构)
-
SQL 等执行过程分为两类,一类对于查询等过程如下:权限校验—》查询缓存—》分析器—》优化器—》权限校验—》执行器—》引擎
-
对于更新等语句执行流程如下:分析器----》权限校验----》执行器—》引擎—redo log prepare—》binlog—》redo log commit