MySql基础架构

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)
  1. 定义:快照读是指事务在读取数据时,看到的是事务开始时的一个数据快照,即事务开始那一刻数据库的状态。这意味着,即使其他事务在快照读之后修改了数据,当前事务也不会看到这些修改,直到它自己的隔离级别允许它看到。

  2. 特点

    • 不会加锁,因此不会阻塞其他事务的写操作。

    • 通常与多版本并发控制(MVCC)机制结合使用,以实现较高的并发性能。

    • 在某些隔离级别下(如可重复读或快照隔离),同一个事务中的多次快照读会看到相同的数据快照。

  3. 应用场景:适用于读取操作频繁,且对数据一致性要求不是特别严格的场景。

当前读(Current Read)
  1. 定义:当前读是指事务在读取数据时,看到的是数据库的最新数据状态。这意味着,当前读会看到所有已经提交的事务对数据的修改。

  2. 特点

    • 可能会加锁,以确保读取的数据是最新的,并且不会被其他事务修改。

    • 在某些隔离级别下(如读已提交或序列化),当前读可能会导致锁冲突,从而影响并发性能。

    • 同一个事务中的多次当前读可能会看到不同的数据状态,因为它们反映的是数据库的最新状态。

  3. 应用场景:适用于对数据一致性要求非常严格的场景,或者在需要确保读取的数据是最新状态的情况下。

查询一条记录,基于MVCC,是怎样的流程
  1. 获取事务自己的版本号,即事务ID

  2. 获取Read View

  3. 查询得到的数据,然后Read View中的事务版本号进行比较。

  4. 如果不符合Read View的可见性规则, 即就需要Undo log中历史快照;

  5. 最后返回符合规则的数据

总结

  • MySQL 主要分为 Server 层和引擎层,Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,同时还有一个日志模块(binlog),这个日志模块所有执行引擎都可以共用,redolog 只有 InnoDB 有。

  • 引擎层是插件式的,目前主要包括,MyISAM,InnoDB,Memory 等。(存储架构)

  • SQL 等执行过程分为两类,一类对于查询等过程如下:权限校验—》查询缓存—》分析器—》优化器—》权限校验—》执行器—》引擎

  • 对于更新等语句执行流程如下:分析器----》权限校验----》执行器—》引擎—redo log prepare—》binlog—》redo log commit

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值