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. 微信小程序示例

    http://www.cnblogs.com/ihardcoder/p/6097941.html http://www.wxapp-union.com/ http://blog.csdn.net/li ...

  2. Linux 文本处理三剑客之grep

    文本处理都要使用正则表达式,正则表达式有: 基本正则表达式:grep或者egrep -G 扩展正则表达式:egreo或者grep -E Linux 文本处理三剑客: sed:stream editor ...

  3. Tomcat中startup.bat启动无效

    error: Linux下启动和关闭tomcat报错,如下图所示: 而在windows下用cmd启动startup.bat也会报如上的错误: Neither the JAVA_HOME nor the ...

  4. 实体类No default constructor found 找不到默认构造函数;

    root cause org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [c ...

  5. ubuntu 12.4,搞定apt源

    http://wiki.ubuntu.org.cn/Template:12.04source deb http://cn.archive.ubuntu.com/ubuntu/ precise main ...

  6. dom元素分屏加载

    载入一个内容较多的页面的时候,如果不做任何处理,则会在一开始就把全部内容加载出来,影响了性能和体验,所以现在常用分屏加载的功能,就是dom内容出现在屏幕可视范围内的时候,再加载dom节点,起到优化的作 ...

  7. 解决VC编译的DLL要安装对应运行环境否则无法使用的问题

    编译时候改成静态链接,再通过使用Depends软件查看依赖即可.具体操作步骤:项目->属性->配置属性->C/C++-代码生成->运行库->多线程(/MT)说明:这种方法 ...

  8. CSS实现火焰效果

    代码如下 //主要就是用css动画实现的 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  9. 八.DBN深度置信网络

    BP神经网络是1968年由Rumelhart和Mcclelland为首的科学家提出的概念,是一种按照误差反向传播算法进行训练的多层前馈神经网络,是目前应用比较广泛的一种神经网络结构.BP网络神经网络由 ...

  10. Android 程序员不得不收藏的个人博客(持续更新...)

    本文已收录我的 Github ,持续更新中 ,欢迎点赞 ! 每周打开一次收藏夹里的个人博客,已经成为了我的人生一大乐趣. 相比各大博客平台,我一直更加偏爱个人博客.在每个人自己的这一亩三分地里,你能看 ...