因为查询缓存失效在实际业务场景中可能会非常频繁,假如你对一个表更新的话,这个表上的所有的查询缓存都会被清空。对于不经常更新的数据来说,使用缓存还是可以的。所以,一般在大多数情况下我们都是不推荐去使用查询缓存的。
MySQL 8.0 版本后删除了缓存的功能,官方也是认为该功能在实际的应用场景比较少,所以干脆直接删掉了。 「3.分析器」(词法分析+语法分析)
MySQL 没有命中缓存,那么就会进入分析器,分析器主要是用来分析 SQL 语句是来干嘛的,分析器也会分为几步:
第一步,词法分析,一条 SQL 语句有多个字符串组成,首先要提取关键字,比如 select,提出查询的表,提出字段名,提出查询条件等等。做完这些操作后,就会进入第二步。
第二步,语法分析,主要就是判断你输入的 sql 是否正确,是否符合 MySQL 的语法。
完成这 2 步之后,MySQL 就准备开始执行了,但是如何执行,怎么执行是最好的结果呢?这个时候就需要优化器上场了。 「4.优化器」(选取MySQL认为最优的方案执行)
优化器的作用就是它认为的最优的执行方案去执行(有时候可能也不是最优,在以后的文章《慢SQL分析》会说到),比如多个索引的时候该如何选择索引,多表查询的时候如何选择关联顺序等。
可以说,经过了优化器之后可以说这个语句具体该如何执行就已经定下来。 「5.执行器」(开始执行)
当选择了执行方案后,MySQL 就准备开始执行了,首先执行前会校验该用户有没有权限,如果没有权限,就会返回错误信息,如果有权限,就会去调用引擎的接口,返回接口执行的结果。
说了这么多都是介绍,下面来张图了解整个过程
三、语句分析
上面说了那么多,都是介绍大致的一个步骤,那么究竟一条sql语句是怎么执行的呢?其实sql语句大致上可以分为两种,一种是查询语句,一种是更新语句(增加、更新、删除)。 「1. 查询语句」
select * from tb_student A where A.age='18' and A.name=' 张三 ';
结合刚刚上面的说明,我们来分析一下这条语句的具体执行流程: