一:查询缓存
作用:
Server 如果在查询缓存中发现了这条 SQL 语句,就会直接将结果返回给客户端;
如果没 有,就去数据库中查询,查询出来之后,将数据返回给客户端,同时再以key-value的形式保存在缓存中,其中 key 就是 SQL语句,value 就是查询的结果
注: 查询缓存往往效率不高,所以在 MySQL8.0 之后就抛弃 了这个功能
移除的原因:
1: 两个查询请求在任何字符上的不同(例如:空格、注释、 大小写),都会导致缓存不会命中。
2: 查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表,如 mysql 、
information_schema 、 performance_schema 数据库中的表,那这个请求就不会被缓存
3:缓存失效: MySQL 的缓存系统会监测涉及到的每张表,只要该表的 结构或者数据被修改, 那使用该表的 所 有缓存查询都将从 缓存中删除!
查询缓存的查看:
show variables like ' %query_cache_type% ' ; 查询当前缓存是否开启
OFF 表示不开启 ON表示开启 DEMAND 表示按需开启
可以在 my.cnf 配置文件中修改
query_cache_type = 0 表示不开启
query_cache_type = 1 表示开启
query_cache_type = 2 表示按需开启
二:解析器
作用:
对 SQL 语句进行 词法分析 和 语法分析
词法分析 :
MySQL 需要识别出SQL语句中 的字符串分别是什么,代表什么。
MySQL 从你输入的 "select" 这个关键字识别出来,这是一个查询语 句。
它也要把字符串 “T” 识别成 “ 表名 T” ,把字符串 “ID” 识别成 “ 列 ID” 。
语法分析 :
根据词法分析的结果,语法分析器(比如: Bison )会根据语法规则,
判断你输 入的这个 SQL 语句是否 满足 MySQL 语法 。
分析完毕之后,如果正确,会生成一颗语法树,如下图所示:
三:优化器
作用:
确定SQL语句执行的具体的最优的方法。
如:该 select * from emp where id = 10001 语句,我们可以通过走索引获取到结果
也可以通过走全表扫描的方式找到结果,优化器就会判断出哪种方案比较好,就会执行哪种方案
四:执行器
作用:
根据优化器得到的方案,调用存储引擎的接口,具体的去执行SQL,得到结果。
流程:
在执行之前需要判断该用户是否 具备权限 。如果没有,就会返回权限错误。
如果具备权限,就执行 SQL 查询,并返回结果。
综上:SQL语句的执行流程为: