4.4 查询执行的基础
MySQL执行一个查询的过程,可以用下图表示:
我们可以看到当向MySQL发送一个请求的时候,MySQL究竟做了什么:
1、客户端发送一条查询给服务器。
2、服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一个阶段。
3、服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。
4、MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。
5、将结果返回给客户端。
4.4.1 MySQL客户端/服务器通信协议
MySQL客户端和服务器之间的通信协议是“半双工”的,这意味着,在任何一个时刻,要么是由服务器向客户端发送数据,要么是由客户端向服务器发送数据,这两个动作不能同时发生。
4.4.2 查询缓存
在解析一个查询语句之前,如果查询缓存是打开的,俺么MySQL会优先检查这个查询是否命中查询缓存中的数据。这个检查是通过一个对大小写敏感的哈希查找实现的。查询和缓存中的查询即使只有一个字节不同,那也不会匹配缓存结果,这种情况下查询就会进入下一个阶段的处理。
4.4.3 查询优化处理
查询的生命周期的下一步是将一个SQL转换成一个执行计划,MySQL再依照这个执行计划和存储引擎之间进行交互。这包括多个子阶段:解析SQL、预处理、优化SQL执行计划这个过程中的任何错误都可能终止查询。
4.4.4 查询执行引擎
在解析和优化阶段,MySQL将生成查询对应的执行计划,MySQL的查询执行引擎则根据这个执行计划来完成整个查询。
4.4.5 返回结果给客户端
查询执行的最后一个阶段是将结果返回给客户端。即使查询不需要返回结果集给客户端,MySQL仍然会返回这个查询的一些信息,如该查询影响到的行数。如果查询可以被缓存,那么MySQL在这个阶段也会将结果存放到查询缓存中。