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