MySQL可以分为Service层和存储引擎层
Service层:连接器、查询缓存、分析器、优化器、执行器
存储引擎层:负责数据的存储和提取
查询语句的执行流程
-
连接到数据库
-
查缓存(不建议使用,MySQL8.0删除掉)
MySQL在拿到一个查询请求之后,会先拿到查询缓存中看一下,如果之前执行过的语句,就会以key-value的形式存储被缓存在内存中。key就是查询语句hash之后的值,value就是查询出来的结果。
- 如果缓存中有,直接返回
- 如果没有,执行,然后将执行结果存储查询缓存中
-
分析SQL语句
- 词法分析:把一个完整的SQL语句分割成一个个的字符串
- 语法分析:判断SQL语句是否满足MySQL语法,如果正确就会根据mysql语法规则与SQL语句生成一个数据结构——解析树
- 预处理器:进一步去检查解析树是否合法,比如表名是否存在,列名是否存在
-
优化SQL语句
根据解析树生成不同的执行计划,然后选择最优的执行计划。
-
执行SQL语句
开始执行之前,要判断这个表有没有执行查询的权限。
如果有,就使用指定的存储引擎打开表开始查询。
为什么不建议使用MySQL的查询缓存?
- 成本高:查询缓存的失效非常的频繁,只要有对一个表的更新,这个表上的所有缓存都被更新
- 命中率也不高。
更新SQL的执行流程
-
连接到数据库
-
查缓存,更新表,这张表的所有缓存全部失效。
-
分析SQL语句
- 词法分析:把一个完整的SQL语句分割成一个个的字符串
- 语法分析:判断SQL语句是否满足MySQL语法,如果正确就会根据mysql语法规则与SQL语句生成一个数据结构——解析树
- 预处理器:进一步去检查解析树是否合法,比如表名是否存在,列名是否存在
-
优化SQL语句
根据解析树生成不同的执行计划,然后选择最优的执行计划。
-
执行SQL语句
- 去存储引擎查询需要更新的数据,存储引擎判断当前缓冲池中是否存在需要的数据,存在就直接返回,否则去磁盘加载
- 存储引擎更新修改到内存中
- 存储引擎记录redo日志,将状态设置为perpare状态
- 通知执行器,修改完毕,提交事务
- 写入bin log,将redolog改为commit状态