目录
前言
提炼自极客时间林晓斌MySQL实战45讲
一
大体来说,MySQL可以分为Server层和存储引擎层两部分。
Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、 Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认存储引擎。
也就是说,你执行create table建表的时候,如果不指定引擎类型,默认使用的就是InnoDB。可以在create table语句中使用 engine=memory, 来指定使用内存引擎创建表
从图中不难看出,不同的存储引擎共用一个Server层 ,也就是从连接器到执行器的部分。
连接器
数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。
短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。
查询缓存
之前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。
key是查询的语句,value是查询的结果。如果你的查询能够直接在这个缓存中找到key,那么这个value就会被直接返回给客户端。
但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。
因此 很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库 来说,查询缓存的命中率会非常低。
需要注意的是,MySQL 8.0版本直接将查询缓存的整块功能删掉了,也就是说8.0开始彻底没有 这个功能了。
分析器
词法分析
你输入的是由多个字符串和空格组成的一条SQL语句,MySQL需要识 别出里面的字符串分别是什么,代表什么。
语法分析
根据词法分析的结果,语法分析器会根据语法规则, 判断你输入的这个SQL语句是否满足MySQL语法。
优化器
优化器是在表里面有多个索引的时候,决定使用哪个索引
或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
执行器
开始执行的时候,要先判断一下你对这个表T有没有执行查询的权限,如果没有,就会返回没有权限的错误。
如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
二
与查询流程不一样的是,更新流程还涉及两个重要的日志模块,它们正是我们今天要讨论的主 角:redo log(重做日志)和 binlog(归档日志)。
WAL的全称是Write- Ahead Logging,它的关键点就是先写日志,再写磁盘