sql语句的执行流程
MYSQL的架构
- 连接层
- 服务层
- 存储引擎层
SQL语句的执行流程
-
建立连接
连接数默认151 最大10000 -
查询缓存
默认关闭 8.0删除 比较鸡肋,因为缓存触发条件苛刻,eg:查询语句完全一样;数据库有数据更新缓存会清空 -
解析器
词法解析 将sql打散成一个一个的词
语法解析 对sql进行语法检验;同时将词法解析成的词语 按照语法规则生成特定的数据结构 ----解析树 -
预处理器
检查生成的解析树,处理解析器无法解析的语义,比如表名、列名是否存在,检查名字和别名保证没有歧义 同时会生成新的解析树 -
查询优化器
一条Sql语句可以有很多种执行方式,但是返回的结果是一样的。查询优化器的目的就是基于解析树生成不同的解析计划,从中选择一个最优的执行计划;MYSQL里面使用的是基于开销的优化器,那种执行计划开销最小就是用哪种。
比如:多表关联查询,基准表的选择;多个索引可以使用时候,选择哪个索引; -
执行计划
优化器优化解析树会得到另一个数据结构的数据-----查询执行计划 使用EXPLAIN可以查看
-
执行引擎
使用执行计划操作存储引擎,通过存储引擎提供的API完成,得到结果最后返回给客户端; -
存储引擎
存储数据的形式。
MYISM 适用只读的场景 支持表锁、记录数据行数、插入和查询较快
INNODB 支持表锁、行锁、外键、事务;支持读写并发,写不阻塞读(MVCC);特殊的索引存放,可以减少IO,提升查询效率
MEMORY 适用临时表 数据存在内存中,读写快;数据库崩溃或者宕机,数据消失;
一条更新SQL的执行
1、建立连接,事务开启,查询缓存(可跳过,默认不开启),然后通过解析器词法解析,语法分析,预处理等生成解析树,然后通过查询优化器获得一个开销最小的执行计划,然后通过执行引擎调用API接口操作存储引擎获取数据,返回查询结果给server的执行器;
2、server的执行器修改数据页中的一行数据;
3、记录修改日志到undo log
4、记录日志到redo log
5、调用存储引擎接口,记录数据页到buffer pool中
6、事务提交;
修改数据的时候会先写入缓冲区的数据页中,因此缓冲区的数据页与磁盘中的数据出现了数据不一致的现象,此时的数据页被称为脏页;将脏页数据更新到磁盘的过程称为刷脏;