1. 查询缓存:
如果在查询缓存中发现了这条 SQL 语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段。(因为查询缓存往往效率不高,所以在 MySQL8.0 之后就抛弃了这个功能。)
查询缓存是提前把查询结果缓存起来,这样下次不需要执行就可以直接拿到结果。在MySQL 中的查询缓存,不是缓存查询计划,而是查询对应的结果。也就是说查询匹配成功的可能性低,只有相同的查询操作才会命中查询缓存。两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中。因此 MySQL 的查询缓存命中率不高。
同时,如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表,如 mysql、 information_schema、 performance_schema 数据库中的表,那这个请求就不会被缓存。
此外,既然是缓存,那就有它缓存失效的时候
。MySQL的缓存系统会监测涉及到的每张表,只要该表的结构或者数据被修改,如对该表使用了INSERT
、UPDATE
、DELETE
、TRUNCATE TABLE
、ALTER TABLE
、DROP TABLE
或DROP DATABASE
语句,那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除!对于更新压力大的数据库
来说,查询缓存的命中率会非常低。
2. 解析器:
在解析器中对 SQL 语句进行语法分析、语义分析。
分析器先做“词法分析
”。你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。 MySQL 从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“T”识别成“表名 T”,把字符串“ID”识别成“列 ID”。
接着,要做“语法分析
”。根据词法分析的结果,语法分析器(比如:Bison)会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法
。如果SQL语句正确,则会生成一个语法树。
3. 优化器:
在优化器中会确定 SQL 语句的执行路径,比如是根据全表检索
,还是根据索引检索
等。在查询优化器中,可以分为逻辑查询
优化阶段和物理查询
优化阶段。
4. 执行器:
在执行之前需要判断该用户是否具备权限
。如果没有,就会返回权限错误。如果具备权限,就执行 SQL查询并返回结果。在 MySQL8.0 以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。
SQL 语句在 MySQL 中的流程是: SQL语句→查询缓存→解析器→优化器→执行器 。