赞
踩
mysql结构图(mysql结构及优化)
执行查询sql时,mysql内部流程如下:
查询流程图
1、客户端发送查询给服务器
2、服务器查询是否命中缓存,命中则立刻返回结果;否则继续执行
3、服务器进行SQL 解析、预处理,并在优化器中生成执行计划
4、服务端根据执行计划,调用存储引擎的API来执行查询
5、将结果返回客户端
1、客户端与服务端通讯
客户端与服务端通讯协议是“半双工”的。任意时刻,两者只能单向传输数据,不能同时互传。只有一方发送完毕,另外一方接收完毕,整个流程才能结束。
2、查询缓存
解析查询语句之前,服务端会检查是否打开缓存。如果缓存为打开状态,通过查询语句的哈希查找实现。如果该哈希值与缓存中的查询哈希不同,则不匹配缓存结果,直接进入下一个流程;如果两哈希值匹配,则会进行查询权限校验;权限校验通过之后,则直接返回缓存中的查询结果,无需继续处理sql。
3、查询优化处理
该阶段又分为三个阶段, 解析sql、预处理、优化sql执行计划。任一过程出现错误,查询都可能终止。
解析sql:通过关键字解析sql语句,并生成对应的 “解析树”,然后解析器使用mysql语法规则 来验证和解析查询。
预处理:预处理器根据一些mysql规则进一步检查和解析数据是否合法
优化器:查询sql通过解析和验证之后的语法树,将有优化器来转化为执行计划。一条查询可以有多种执行方式,最后返回相同结果。优化器找到之中最好的执行计划
执行计划:mysql最终生成查询的指令树,然后通过存储引擎执行完成这棵指令树并返回结果。最终的执行计划包含了重构查询的全部信息
4、查询执行引擎
在解析和优化阶段,mysql生成的执行计划。查询执行引擎则根据这个执行计划来完成整个查询。执行计划是一个数据结构,而不是像其他关系型数据库那样的字节码。
执行计划的指令执行期间,会大量调用存储引擎实现接口的操作,来完成查询。
5、返回给客户端
查询执行的最后一个阶段将结果返回给客户端,即使客户端不需要的返回结果,mysql仍然返回查询的一些信息,如影响的行数。如果开启了缓存,mysql 也会将结果放到查询缓存中。
返回客户端数据是一个增量的过程,这样减少服务器存储结果的压力,另外客户端也能尽快拿到返回的结果。结果集中的每一行都会以一个满足mysql客户端/服务器通信协议的包发送,再通过tcp协议进行传输,在tcp传输的过程中,可能对mysql的封包进行缓存然后批量传输。
参考
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。