mysql 语句的查询过程解析
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 语句的查询过程解析的更多相关文章
- MySQL慢日志查询全解析:从参数、配置到分析工具【转】
转自: MySQL慢日志查询全解析:从参数.配置到分析工具 - MySQL - DBAplus社群——围绕数据库.大数据.PaaS云,运维圈最专注围绕“数据”的学习交流和专业社群http://dbap ...
- Mysql语句的执行过程
当你希望MySQL能够以更高的性能运行查询时,最好的办法是弄清楚MySQL是如何优化和执行查询.<高性能MySQL> MySQL客户端与服务器端的通信特点 客户端与服务器之间是半双工通信, ...
- mysql 语句执行的过程
客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的执行计划: mysql根据优化器 ...
- 图解Mysql语句的执行过程
当我们希望Mysql能够高性能的执行查询语句时,其实最好的方法就是搞清楚Mysql到底是怎样执行查询的.一旦理解这一点,很多的查询优化工作实际上就是遵循一些原则让查询优化器能够按照预想的合理的方式运行 ...
- 【夯实Mysql基础】记一次mysql语句的优化过程
1. [事件起因] 今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多. 一个sql是 链接了5个表同时使 ...
- 【夯实Mysql基础】记一次mysql语句的优化过程!
1. [事件起因] 今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多. 一个sql是 链接了5个表同 ...
- [ES]elasticsearch章2 ES查询过程解析
es服务端是准确知道每个document分布在哪个shard上: search一个比较复杂的执行模式,因为我们不知道那些document会被匹配到,任何一个shard上都有可能,所以一个search请 ...
- thinkphp 使用原生mysql语句 联合查询
<?php class DelAction extends Action { public function ml(){ // 实例化一个空模型,没有对应任何数据表 $Dao = M(); // ...
- MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY)
在上一篇文章MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介中介绍了EXPLAIN语句,并举了一个慢查询例子:
随机推荐
- C#icon图标文件转Image
Icon icon = ICONHelper.GetFileIcon(filePath); MemoryStream mStream = new MemoryStream();//创建内存流 icon ...
- 2019-7-15-win10-uwp-在笔迹开始书写拿到书写移动事件
title author date CreateTime categories win10 uwp 在笔迹开始书写拿到书写移动事件 lindexi 2019-7-15 8:58:5 +0800 201 ...
- apache https 双向认证
Https分单向认证和双向认证 单向认证表现形式:网站URL链接为https://xxx.com格式 双向认证表现心事:网站URL链接为https://xxx.com格式,并且需要客户端浏览器安装一个 ...
- 直接在安装了redis的Linux机器上操作redis数据存储类型--String类型
一.概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型 ...
- GIT → 09:TortoiseGit 图形化工具
GIT → 09:TortoiseGit 图形化工具
- linux追加中文字库,解决imagemagick 中文乱码的问题。
Windows下的字体丰富多样,而且显示的工整.漂亮. 所以自己想把windows上的字体移到Ubuntu下来.Windows下字体库的位置为C:\Windows\fonts,这里面包含所有windo ...
- springboot中logback打印日志(转)
springboot对logback的支持是非常好的,不需要任何配置,只需要在resource下加logback.xml就可以实现功能 直接贴代码: <?xml version="1. ...
- uptime查看服务器运行时间
uptime命令用于查看服务器运行了多长时间以及有多少个用户登录,快速获知服务器的负荷情况. uptime的输出包含一项内容是load average,显示了最近1,5,15分钟的负荷情况.它的值代表 ...
- 【模板】tyvjP1520 树的直径 [2017年5月计划 清北学堂51精英班Day3]
P1520 树的直径 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 树的直径,即这棵树中距离最远的两个结点的距离.每两个相邻的结点的距离为1,即父亲结点与儿 ...
- Axure之添加点击页面
添加悬停字体变色的效果 页面载入时的频道预设(我做错了,英文版本不知道那个是页面载入时的事件) 我的博客不够完善,看不到全部的图片.我后续会修改我的网站的