您的位置:首页 > 数据库 > MySQL

MySql查询执行过程

2016-12-06 01:37 176 查看

为什么要了解查询执行过程

当希望MySql能够以更高的性能运行查询时,首先需要弄清楚MySql是如何执行查询的,很多查询优化工作实际上就是遵循一些原则让优化器能够按预想的合理方式运行。

MySql查询执行流程图



通过上图可以清晰的了解到MySql查询执行的大致过程:

- 1.发送语句

- 2.查询缓存

- 3.查询优化

- 4.执行查询

- 5.返回结果

执行过程详解

发送语句: 客户端发送查询语句给mysql服务器

查询缓存: 用于保存MySQL查询语句返回的完整结果,如果查询缓存是打开的,服务器会先检查查询缓存中的数据

命中时,MySQL会立即返回结果,省去解析、优化和执行等阶段。否则,进入下一阶段。

MySQL保存结果于缓存中,把select语句本身做hash计算,计算的结果作为key,查询结果作为value。

查询语句的大小写会影响缓存的存储和命中,故需保持查询语句的大小写一致性。

查询优化: 优化处理会将一个SQL转换成一个执行计划,mysql依照这个执行计划和存储引擎进行交互,此处包含多个子阶段,解析SQL、预处理、优化SQL执行计划(过程中任何错误都可能终止查询)。

解析器: mysql解析器使用mysql语法规则验证和解析查询,通过关键字将SQL语句进行解析,生成对应的“解析树”。

预处理器:预处理器根据mysql规则进一步检查解析树是否合法。

查询优化器:当语法树被认为是合法的了,优化器便将其转化成执行计划。一条查询可以有很多种执行方式,最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。

执行查询

在解析和优化阶段,mysql将查询生成对应的执行计划,查询执行引擎则根据这个执行计划来完成整个查询。这里的执行计划是一个数据结构,而不是和很多其他的关系型数据库那样对应的字节码。

mysql根据执行计划给出的指令逐步执行,在此执行的过程中,有大量的操作需要通过调用存储引擎实现的接口来完成。为了执行查询,mysql只需要重复执行计划中的各个操作,直到完成所有的数据查询。

返回结果: 将查询结果返回给客户端。

即使查询无需返回结果,mysql仍会返回该查询的一些信息,如影响到的行数。

如果查询可以被缓存,那么mysql在该阶段也会将结果放到查询缓存中。

mysql将结果集返回客户端是一个增量、逐步返回的过程。这样有两个好处:服务器端无须存储太多的结果,也就不会因为返回太多结果而消耗太多的内存;这样处理也让msyql客户端第一时间获得返回的结果。

结果集中的每一行都会以一个满足mysql客户端/服务器通信协议的包发送,再通过tcp协议进行传输,在tcp传输的过程中,可能对mysql的封包进行缓存然后批量传输。

缓存注意事项

1.何种语句不会被缓存

查询语句中有一些不确定数据时,不会缓存,如now(),current_time()等

若查询中包含用户自定义函数,存储函数,用户变量,临时表,mysql库中系统表,或者任何包含权限的表,一般都不会缓存

2.缓存会带来额外开销

读查询在开始之前必须先检查是否命中缓存。

若某个读查询可以被缓存且未被缓存,那么当完成执行后,MySQL会将其结果存入查询缓存。

对写操作也有影响,因为当写入数据时,MySQL必须将对应表的所有缓存都设置失效,这在缓存内存较大时将导致很大的系统消耗。

故查询缓存并非必需,其效率取决于全部查询中开销较大的查询是否能被缓存命中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql