Mysql分为Server层和存储引擎层:
Server层
主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎层
存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。也就是说如果我们在create table时不指定表的存储引擎类型,默认会给你设置存储引擎为InnoDB。
server层的执行过程:
连接器
首先连接器会判断该用户提交的SQL是否有权限,如果有权限才会进行后续的执行操作,连接器负责跟客户端建立连接、获取权限、维持和管理连接。
查询缓存
对于有相同查询条件的请求会在查询缓存中判断是否有之前请求的缓存结果。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。可以看到,如果查询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。
分析器
如果本次请求没有缓存命中,在分析器中用以进行词法和语法的分析,如果不符合规范则会抛出异常。
优化器
词法语法分析正常的话会进行优化器处理,在这个阶段会进过成本代价分析后,选择合适的索引。
执行器
最后调用选择的存储引擎来进行数据的查询和更新等操作。

mysql执行一句更新操作的数据不会立即写入磁盘,会先放到buffer pool中,这是内存中的一片暂存区,等一段时间会刷入磁盘中。这样设计的作用是提高读写数据的效率。
WAL是先写日志再进行刷盘操作,就是会先将操作写入到redo log+binlog中,再将buffer pool中数据刷入磁盘;这样做的优势是:(1)保障数据不会丢失。及时数据服务crash,也能从redo log中进行恢复;(2)由于刷盘操作是顺序操作,相对于随机写的效率会高很多;(3)实际修改先写入buffer pool中,等内存满了在刷盘,这样明显降低了IO次数,提升了IO效率。