当前位置:首页 > 站长教程 > 数据库 > Mysql > MySQL查询执行

MySQL查询执行

时间:2019-01-25人气:694来源:原创我要评论(0)

当我们希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,很多查询优化工作实际上就是遵循一些原则让优化器能够按照预想的合理方式运行

当我们想向MySQL发送了一个请求时,MySQL到底做了什么:

MySQL查询执行

客户端首先发送一条查询请求给服务器

服务器首先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果,否则进入下一阶段。

服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划

MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询

将结果返回客户端

MySQL客户端和服务器之间的通信协议是“半双工”的,这意味着,在任何一个时刻,要么是由服务器向客户端发送数据,要么是由客户端向服务器发送数据,这两个动作不能同时发生。所以,我们无法也无需将一个消息切成小块独立来发送。


客户端使用一个单独的数据包将查询传给服务器,当查询语句太长时,服务端就会拒绝接受更多的数据并且抛出相应的错误。因此,当查询语句很长时,参数max_allowed_packet就特别重要。

换而言之,当客户端从服务器获取数据时,MySQL会一直向客户端推送数据,客户端也没法让服务器停下来。

对于一个MySQL连接或者说一个线程,任何时刻都有一个状态,该状态表示了MySQL当前正在做什么:

查询缓存

查询和缓存中的查询即使只有一个字节不同,也不会匹配缓存结果。这种情况下查询就会进入下一个阶段。

如果权限没有问题,MySQL就会跳过所有其他阶段,直接从缓存表中拿到结果并且返回给客户端。在这种情况下,查询不会被解析,不用生成执行计划,不会被执行。
[yiij]查询优化处理[/yiji]
查询的生命周期的下一步是将一个SQL转换成一个执行接话,MySQL再按照这个执行计划和存储引擎进行交互。

这些过程中任何出错都可能终止查询。

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

在这个阶段中,如果查询是可以被缓存的,那么MySQL在这个阶段也将会被存放到查询缓存中。

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


温馨提示:以上内容和图片整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!如有侵权行为请联系删除!

相关文章

网友评论

请自觉遵守互联网相关政策法规,评论内容只代表网友观点,与本站立场无关!

最新评论

还没有收到评论,赶紧来抢沙发吧~

关于站长下载 | 联系方式 | 发展历程 | 版权声明 | 下载帮助(?) | 广告联系 | 网站地图 | 友情链接

Copyright 2005-2019 Downzz.Com 【站长下载】 版权所有 浙ICP备17005543号 | 浙公网安备 42011102000245号工信部

声明: 本站部分内容属于原创转载请注明出处 如有侵权行为请严格参照本站【版权声明】与我们联系,我们将在48小时内容进行处理!