来自极客时间,林晓斌(丁奇)的MySQL实战45讲
一条SQL查询语句是如何执行的
MySQL基本架构
课后问题
-
MySQL的框架有几个组件,各有什么作用?
连接器、分析器、优化器、执行器、查询缓存(8.0后被删除)、存储引擎 -
server层和存储引擎层各有什么作用?
Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。 -
you have an error in your sql syntax是在词法分析还是语法分析报错
语法分析。分析器,先进行词法分析,比如先识别select关键字, T代表表明等;然后进行语法分析,判断sql是否满足MySQL的语法 -
对表的操作权限验证是在哪里进行的?
执行器 -
执行器的执行查询语句的流程是什么样?
1)判断是否有用查询权限
2)根据表的引擎定义去进行查询
2.1)调用innodb引擎接口,获取满足条件的第一行
2.2)循环获取满足条件的下一行
2.3)执行器将满足条件的行组成结果集返回客户端
redo log(InnoDB特有)
redo log又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。在实例和介质失败(media failure)时,redo log文件就能派上用场,如数据库掉电,InnoDB存储引擎会使用redo log恢复到掉电前的时刻,以此来保证数据的完整性。
crash-safe
定义:即使mysql服务宕机,也不会丢失数据的能力
如何记录redo log
- write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。
- checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。
- write pos 和 checkpoint 之间的是“粉板”上还空着的部分,可以用来记录新的操作
- 如果 write pos 追上 checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下。
binlog(server层)
Binlog有两种模式,statement 格式的话是记sql语句, row格式会记录行的内容,记两条,更新前和更新后都有。
为什么有两份日志?
因为最开始 MySQL 里并没有 InnoDB 引擎。MySQL 自带的引擎是 MyISAM,但是 MyISAM 没有 crash-safe 的能力,binlog 日志只能用于归档。而 InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,所以 InnoDB 使用另外一套日志系统——也就是 redo log 来实现 crash-safe 能力。
redo log和bin log的区别
- redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
- redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
- redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
更新流程
# 执行流程图
update T set c=c+1 where ID=2