1. 介绍
1.1 查询
1.1.1 查询缓存
MySQL 拿到一个查询请求后先会在查询缓存中看看是否执行过此语句,之前执行的语句会以 key-value 的形式缓存在内存中,key 是缓存的语句,value 是查询的结果。如果命中缓存则直接将结果返回,如果没有命中则继续执行后面。查询缓存默认是关闭的,Mysql8.0直接删除查询缓存。
1.1.2 解析器生成解析树
(1)词法解析
关于解析完生成的解析树类似下图,我以’select name from user_info where sex=1 and age>20’为例:
1.1.3 预处理再生成解析树
(1)预处理
根据mysql的语法的规则进一步检查解析树的合法性,如:检查数据的表 和列是否存在,解析名字和别名的设置,还会进行权限的验证。
(2)再生成解析树
1.1.4 查询优化器
- 选择最合适的索引;
- 选择表扫还是走索引;
- 选择表关联顺序;
- 优化 where 子句;
- 排除管理中无用表;
- 决定 order by 和 group by 是否走索引;
- 尝试使用 inner join 替换 outer join;
- 简化子查询,决定结果缓存;
- 合并试图;
1.1.5 查询执行计划
查询最后一次查询的消耗,用以比较开销。
1.1.6 查询执行引擎
调用插件式的存储引擎的原子API的功能进行执行计划的执行。