mysql 执行一条语句的过程

执行流程:

  • 如下图:当向mysql发送一条请求时,MySQL到底做了什么?
    在这里插入图片描述
    客户端发送一条查询给服务器;
    服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果,否则进入下一阶段;
    服务端进行sql解析,预处理,在由优化器生成对应的执行计划;
    MySQL根据优化器生成的执行计划,调用存储引擎的api来执行查询;
    将结果返回客户端;

查询缓存:

	在解析一个查询语句之前,如果查询缓存是打开的,那么mysql会优先检查这个查询是否命中缓存中的数据,这个检查是通过一个队大小写敏感的哈希查找实现的。查询和缓存中的查询字段即使有一个字节不同,那么也不会匹配缓存结果。
	如果当前的查询恰好命中了缓存,那么在返回结果之前会检查一次用户权限。、这仍然是无需解析查询sql语句的,因为在查询缓存中已经存放了当前查询需要访问的表信息。如果权限没问题,MySQL会跳过其他阶段,直接冲缓存中拿到结果并返回给客户度Jan。跳过了解析 优化和执行截断。
	查询缓存系统会跟踪查询中涉及的每一个表,如果这些表发生变化,那么和这个表相关的所有缓存数据将失效,这种机制效率看起来比较低,因为数据变化时很有可能对应的查询结果没有变更,但是这种简单实现代价很小,而这点对于非常繁忙的系统来说非常重要;

有关查询缓存的配置

query_cache_type 是否打开查询缓存;
query_cache_size 查询缓存使用的总内存空间,单位是字节;
query_cache_min_res_unit 在查询缓存中分配内存块时最小单位
query_cache_limit Mysql 能够缓存的最大查询结果,如果查询结果大于这个值,则不会被缓存;

语法解析器和预处理

	首先,MySQL通过关键字将sql语句进行解析,并生成一棵对应的解析树。mysql解析器将使用mysql语法规则验证和解析查询。例如。他将验证是否使用了错误的关键字等;
	预处理器则根据一些mysql规则进一步检查解析树是否合法,例如:这里将检查数据表和数据列是否存在;
	下一步会验证权限;

查询优化器

现在的语法树认为是合法的了,并且由优化器将其转为执行计划,一条查询可以有很多执行方式,最后都返回相同的结果,优化器的作用就是找到这其中最好的执行计划;
msyql使用基于成本的优化器,他将尝试预测一个查询使用某种执行计划时的成本,并选择一个成本最小的一个;
mysql查询优化器在生成查询的执行计划时,需要向存储引擎获取相应的统计信息,存储引擎则提供给优化器对应的统计信息,包括:每个表或者索引有多少个页面,每个表的每个索引的技术是多少,数据行和索引长度,索引的分布信息等,优化器根据这信息来选择最优的执行计划;

查询执行引擎

相对于查询优化阶段,查询执行截断不是那么复杂;MySQL只是简单的根据执行计划给出的命名逐步执行,在根据计划逐步执行的过程中,有大量的操作需要通过调用存储引擎实现的接口实现来完成;

返回结果给客户端

查询执行的最后一个阶段是将结果返回客户端。即使查询不需要返回结果集给客户端,MySQL仍然会返回这个查询的一些信息,如该查询影响到的行数;
如果查询结果可以被缓存,那么mysql在这个阶段也会将结果存放到查询缓存中;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值