MySQL执行过程以及查询缓存的详细介绍


本文摘自PHP中文网,作者不言,侵删。

本篇文章给大家带来的内容是关于MySQL执行过程以及查询缓存的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

MySQL执行一个查询过程:
当我们向MySQL发送一个请求的时候,MySQL到底做了什么:

649305080-5c9f47a380d1d_articlex.png

1.客户端发送一条查询给服务器
2.服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。
3.服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。
4.MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询
5.将结果返回给客户端。

mysql 主要是由 server 层和存储层两部分构成的。
server 层主要包括连接器、查询缓存,分析器、优化器、执行器。
存储层主要是用来存储和查询数据的,常用的存储引擎有 InnoDB、MyISAM,

(1) MySQL客户端/服务器通信协议

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

优缺点:
这种协议让MySQL通信简单快速,但是也从很多地方限制了 MySQL。
一个明显的限制是,这意味着没法进行流量控制。一旦一端开始发送消息,另一端要接收完整个消息才能响应它。这就像采回抛球的游戏:在任何时刻,只有一个人能控制球,而且只有控制球的人才能将球抛回去(发送消息)。

(2).连接器

MySQL客户端和服务端建立连接,获取当前连接用户的权限

(3)查询缓存
在解析一个查询语句之前,如果查询缓存是打开的,MySQL会检查这个缓存,是否命中查询缓存中的数据。这个检查是通过一个大小写敏感的哈希查找实现的。
查询和缓存中的查询即使只有一个字节不同,那也不会匹配缓存结果,这种情况下查询
就会进入下一阶段的处理。

如果当前的查询恰好命中了查询缓存,那么在返回查询结果之前 MySQL会检查一次用
户权限。这仍然是无须解析查询SQL语句的,因为在查询缓存中已经存放了当前查询需
要访问的表信息。如果权限没有问题, MySQL会跳过所有其他阶段,直接从缓存中拿
到结果并返回给客户端。这种情况下,查询不会被解析,不用生成执行计划,不会被执行.

ps:注意在 mysql8 后已经没有查询缓存这个功能了,因为这个缓存非常容易被清空掉,命中率比较低。

(3).分析器

既然没有查到缓存,就需要开始执行 sql 语句了,在执行之前肯定需要先对 sql 语句进行解析。
分析器主要对 sql 语句进行语法和语义分析,检查单词是否拼写错误,还有检查要查询的表或字段是否存在

(4)查询优化

查询的生命周期的下一步是将一个SQL转换成一个执行计划, MySQL再依照这个执行
计划和存储引擎进行交互。这包括多个子阶段:解析SQL、预处理、优化SQ执行计划。
这个过程中任何错误(例如语法错误)都可能终止查询。

2.关于查询缓存

(1)
MySQL 判断缓存命中的方法很简单:缓存存放在一个引用表中,通过一个哈希值引用。
MySOL查询缓存保存查询返回的完整结果。当查询命中该缓存, MySQL会立刻返回结果跳过了 解析,优化和执行阶段

查询缓存系统会跟踪查迫中涉及的每个表,如果这些表发生变化,那么和这个表相关的的存数据都将失效。

这种机制效率看起来比较低,因为数据表变化时很有可能对查询结果并没有变更,但是这种简单实现代价很小,而这点对于一个非常繁忙的系统来说非常重要。

查询缓存系统对应用程序是完全透明的。应用程序无须关心 MySQL是通过查询缓存返回的结果还是实际执行返回的结果。事实上,这两种方式执行的结果是完全相同的。换句话说,查询缓存无须使用任何语法。无论是 MYSQL开启成关闭查询缓在,对应用程序都是透明的。

(2)判断缓存命中

当判断缓存是否命中时, MySQL不会解析、“正规化”或者参数化查询语句,而是直接使用SQL语句和客户端发送过来的其他原始信息,在字符上不同,例如空格、注释,在何的不同,都会导致缓存的不中。

当查询语句中有一些不确定的数据时,则不会被缓存,例如包含函数NOW()或者 CURRENT_DATE()
的查询不会被缓存.

误区:
我们常听到:“如果查询中包含一个不确定的函数, MySQL则不会检查查询缓存”。这个说法是不正确的。

因为在检查查询缓存的时候,还没有解析SQL语句,所以MySQL并不知道查询语句中是否包含这类函数。

在检查查询缓存之前, MySQL只做一件事情,就是通过一个大小写不敏感的检查看看SQL语句是不是以5EL开头。

准确的说法应该是:“如果查询语句中包含任何的不确定函数,那么在查询缓存中是不可能找到缓存结果的”。

注意点:
MySQL的查询缓存在很多时候可以提升查询性能,在使用的时候,有一些问题需要特别注意。首先,打开查询缓存对读和写操作都会带来额外的消耗:

阅读剩余部分

相关阅读 >>

mysql 5.7.11 zip安装配置方法图文教程

mysql双主全库同步复制的示例详解

anemometer图形化显示mysql慢日志的工具搭建及使用的实例解析

mysql如何在cmd登录

mysql找回用户数据的实例详解

mysql语句与java代码实现按需过滤企业员工的资质证书

怎么在dos下连接mysql

mysql子查询的使用详解下篇

mysql 的replace into详解

mysql开启慢查询日志的方法详解

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...