select * from tb where ID = 1

下面解析的查询过程都是基于上面的简单查询,该系列的所有素材都来自于丁奇的mysql的45讲

1、建立连接

  a、客户端发出请求,请求首先到达连接器,然后连接器去校验用户名和密码,如果校验通过,则去权限表读取该用户的权限,并且之后该连接的所有操作都是基于该次权限的读取。

  b、如果你在这次连接建立之后,再用管理员账号去修改该用户的账号权限,也不会对该次连接的后续操作生效,除非再次建立个新的连接;一个连接建立之后如果没有后续操作,则该连接处于空闲状态;如果长时间没有动静,则连接器会自动断开该次连接,这个时间由参数指定(wait_timeout),默认是8个小时。

2、查询缓存

  a、连接建立之后就开始查询缓存:mysql收到一个请求之后会先去查询缓存,看看这条语句是否被执行过,之前执行过的语句和结果会以键值对的形式存在缓存中,如果在缓存中查到了该语句,则会将结果直接返回给客户端。如果没有查询到,则会继续执行后面的流程,同时会将查询的结果放到缓存中;需要注意的是查询缓存失效非常频繁,只要有对表的更新,那么这个表中所有的缓存都会被清空,是否需要查询缓存,mysql都有参数设置,按需设值,在后续8.0的版本中,查询缓存的功能将会被删除掉。

3、分析器

  a、这一步是该条查询语句没有命中缓存的时候才到这里,首先分析器会对你的sql语句做词法分析,然后再做语法分析。词法分析:mysql需要把sql语句识别出来,哪个字符串代表什么,select会被识别为查询,tb会被识别为表,字符串ID会被识别为列ID;做完这些分析之后,再去做语法分析:根据词法分析的结果,语法分析会根据语法分析的结果判断sql是不是满足MYSQL语法规则,如果不满足,则会抛出一个错误。

4、优化器

  a、一条sql经过分析器之后,mysql就知道他要干嘛了,这时候并不是把sql拿去执行,这中间还有一个优化器,这个优化器是在该表有多个索引或者多表关联的时间决定用哪个索引或者决定哪条子查询先执行,总体来说就是选择效率最高的一种方案来执行。

5、执行器

  a、在经过了分析器和优化器之后,sql才能到达执行器被真正执行。在开始执行的时候,首先会判断该次连接的对象对该表是否有操作权限。如果没有则返回权限不足的错误,如果有权限就继续打开表执行,在打开表的时候,执行器会根据表的引擎定义去使用这个引擎提供的接口。

  b、以上面的查询语句为例,假设该表没有索引,执行器的具体流程是:调用InnoDB引擎接口取这个表的第一行,并判断该ID的值是不是等于1,如果不是则跳过,如果是则将这行存到结果集中并且继续去取下一行数据,判断逻辑相同,知道取到该表的最后一行,最后执行器将上面所有满足条件的行组成记录集作为结果集返回给客户端。至此,一条sql的执行流程就走完了。

mysql 语句的查询过程解析的更多相关文章

  1. MySQL慢日志查询全解析:从参数、配置到分析工具【转】

    转自: MySQL慢日志查询全解析:从参数.配置到分析工具 - MySQL - DBAplus社群——围绕数据库.大数据.PaaS云,运维圈最专注围绕“数据”的学习交流和专业社群http://dbap ...

  2. Mysql语句的执行过程

    当你希望MySQL能够以更高的性能运行查询时,最好的办法是弄清楚MySQL是如何优化和执行查询.<高性能MySQL> MySQL客户端与服务器端的通信特点 客户端与服务器之间是半双工通信, ...

  3. mysql 语句执行的过程

    客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的执行计划: mysql根据优化器 ...

  4. 图解Mysql语句的执行过程

    当我们希望Mysql能够高性能的执行查询语句时,其实最好的方法就是搞清楚Mysql到底是怎样执行查询的.一旦理解这一点,很多的查询优化工作实际上就是遵循一些原则让查询优化器能够按照预想的合理的方式运行 ...

  5. 【夯实Mysql基础】记一次mysql语句的优化过程

    1. [事件起因] 今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多. 一个sql是 链接了5个表同时使 ...

  6. 【夯实Mysql基础】记一次mysql语句的优化过程!

      1. [事件起因] 今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多. 一个sql是 链接了5个表同 ...

  7. [ES]elasticsearch章2 ES查询过程解析

    es服务端是准确知道每个document分布在哪个shard上: search一个比较复杂的执行模式,因为我们不知道那些document会被匹配到,任何一个shard上都有可能,所以一个search请 ...

  8. thinkphp 使用原生mysql语句 联合查询

    <?php class DelAction extends Action { public function ml(){ // 实例化一个空模型,没有对应任何数据表 $Dao = M(); // ...

  9. MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY)

    在上一篇文章MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介中介绍了EXPLAIN语句,并举了一个慢查询例子:

随机推荐

  1. Leetcode102. Binary Tree Level Order Traversal二叉树的层次遍历

    给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其 ...

  2. javascript go()函数

    <a href="javascript:history.go(-1);">返回上一页</a> put this in your input tag < ...

  3. 码云及git使用

    首次使用码云,将本地文件与之关联(创建仓库之后的页面截图) git -- 版本控制(协同开发软件) git add . # 将当前文件下所有内容添加到临时缓存区 git commit -m " ...

  4. Django--创建

    软件开发架构: c/s架构 客户端 服务端 b/s架构 浏览器 服务端 本质:b/s架构也是c/s架构 HTTP协议 超文本传输协议:规定了客户端与服务端之间消息传输的格式 四个特性: 1.基于TCP ...

  5. mysql创建数据库指定utf8编码

    CREATE DATABASE IF NOT EXISTS dbname DEFAULT CHARSET utf8;

  6. python OneHot编码

  7. 关于在eclipse中安装各种插件的问题

    在eclipse中安装php插件的方法 参考转载链接:eclipse 安装php插件 并配置环境 elipse的php插件地址:https://www.eclipse.org/pdt/ 以下可能会用到 ...

  8. 几道面试题-考察JS的运用

    1.定义一个方法,传入一个string类型的参数,然后将string的每个字符间加个空格返回,比如: spacify('hello world') // => 'h e l l o  w o r ...

  9. C 语言中 #pragma 的使用

    在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情 ...

  10. Python 五个知识点搞定作用域

    Python 五个知识点搞定作用域 1.块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗? #块级作用域 if 1 == 1: name = "lzl" print(na ...