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. Jmeter运行原理

    Jmeter运行原理: JMETER是运行在JVM虚拟机上的,每个进程的开销比loadrunner的进程开销大,如果以进程的方式来运行每台负载机上的进程数量不会允许太多,当有大量并发时就需要大量的负载 ...

  2. 使用Maven编译运行Storm入门代码(Storm starter)(转)

    Storm 官方提供了入门代码(Storm starter),即 Storm安装教程 中所运行的实例(storm-starter-topologies-0.9.6.jar),该入门代码位于 /usr/ ...

  3. vim编辑shell

      vi编辑 u撤销 i输入 dd删除游标所在的那一整行(常用) yy复制游标所在的那一行(常用) p 为将已复制的数据在光标下一行贴上 nyy n 为数字.复制光标所在的向下 n 行,例如 20yy ...

  4. Broken Keyboard UVA 11988 数组实现链表

    这个构造十分巧妙,,,又学到一招,有点类似数组实现的邻接表 #include <iostream> #include <string.h> #include <cstdi ...

  5. Leetcode137. Single Number II只出现一次的数字2

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: ...

  6. Django项目:CRM(客户关系管理系统)--44--36PerfectCRM实现King_admin密码修改

    # king_urls.py # ————————02PerfectCRM创建ADMIN页面———————— from django.conf.urls import url from king_ad ...

  7. 用canvas 画出圆形图片

    /** * 把图片处理成圆形,如果不是正方形就按最小边一半为半径处理 * @param {object} imgObj 图片(img)对象 * @param {number} imgType 设置生成 ...

  8. 对BOM的总结

    参考:JavaScript半知半解 TG著 BOM对象 Window对象是客户端JavaScript程序的全局对象. Window对象使得JavaScript与浏览器进行交互. 所有的JavaScri ...

  9. java swing多线程

    比如一个爬虫 在界面上显示当前时间,每秒都刷新一次用来判断软件是不是卡死 在爬取程序运行的时候,界面可能会卡死 那这就要把爬取程序放在另一个线程里边 同时,也可以把rtc放在另一个线程里边 具体代码, ...

  10. file.length()方法返回0字节

    本地调试ok 扔到服务器上就返回0 初步估测是因为使用jnotify监控文件修改事件的时候,刚好文件被重命名了(下载完成后xxx.tmp,被改成正确的后缀名) 2019-7-20:不是上边说的那个亚子 ...