一条查询语句在MySQL中是如何执行的?
前言
我们在学习一种技术的时候,首先要鸟瞰其全貌,千万不要一开始就陷入到细节中去,这样有助于我们站在高维度其理解问题 —— 丁奇。
学习MySQL也是一样,所以我们可以从一条查询语句的执行开始看起。
select * from t where id = 1;
通常情况下,我们在使用MySQL的时候,只是从客户端输入一行指令,然后获取一个返回结果。
但是对于一个开发人员来说,只知道这些是远远不够的,我们还需要知道这句指令背后的执行流程,便于排查问题。
MySQL逻辑架构
这里还是引用丁奇老师的MySQL系统结构图:

MySQL可以分为Service层和存储引擎层两部分。
- Service层又可分为:连接器、查询缓存、分析器、优化器、执行器。在MySQL中,跨存储引擎层的的功能都在这一层实现,如日期函数、存储过程、视图等。
- 存储引擎层负责数据的存储和提取,是一个插件式的结构,一个Service可以对应多个存储引擎。常见的存储引擎有:InnoDB、MyISAM、Memory等。
连接器
连接器负责客户端与Mysql服务器的建立连接、获取权限、管理连接。连接命令一般是这么写的:
mysql -h$ip -P$port -u$user -p
如果用户名和密码校验通过后,连接器就会从权限表中查到该用户的权限。后续当该用户执行操作的时候,依赖的都是这个时候读取到的权限。
创建连接后,我们就可以使用 show processlist查看该连接:

如果客户端在一段时间没用任何指令,那么这个连接就会被断开。这个参数是wait_timeout,默认时间为8小时。
这里还涉及到一个概念, 长连接和短连接 。
- 长连接:建立连接后,如果客户端持续有请求,则一直使用同一个连接。
- 短连接:指执行完很少的指令,连接就断开了,如果有后续的指令,就需要重新建立连接。
建立连接的过程是相对复杂的,所以我们应该避免短连接,那是不是连接越长越好?也不是这样。MySQL在执行过程中使用的内存是管理在连接中的,这些资源资源会在断开连接的时候才会被释放。如果一直得不到释放,就会有OOM的问题,表现出来的现象就是MySQL异常重启了。
- 所以我们需要定时的断开长连接,或者是判断执行过一个占用内存的大查询后,断开连接。
- 如果是Mysql 5.7版本后,可以在执行一个大操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。
查询缓存
通常情况下我们不会启用查询缓存,因为这个缓存命中率不高,每次对表的更新,都会清空缓存。在MySQL8.0后的版本被移除。
分析器
MySQL中的分析器,主要有两个作用,分别是词法分析和语法分析。词法分析的作用是将SQL语句将我们的数据库结构相对应,比如将字符t对应成表T,将字符id对应表中的id列。
select * from t where id = 1;
语法分析做的是检测我们输入的命令是否符合MySQL语法,如果语句不对,则会有相应的提示,便于我们去修改:

优化器
经过了分析器,MySQL已经知道了我们想做什么了,接下来就该是怎么做。
比如在有多个索引的时候,选择哪个索引可以减少扫描数据的行数。进行多表联合查询的时候,哪张表作为驱动表,会减少扫描数据的行数等。
执行器
执行器的工作就是执行语句,但是在执行之前,会先判断该用户的权限,只有通过了权限认证,才可以执行语句。如果该用户有权限,执行器会打开表,调用相应存储引擎的接口,而存储引擎接口负责将数据存入结果集中返回给客户端。
小结
以上就是一条查询语句在MySQL中的执行过程,这对我们理解MySQL的执行过程,进行数据库调优是十分重要的。
一条查询语句在MySQL中是如何执行的?的更多相关文章
- 一条SQL语句在MySQL中是如何执行的
概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 mysql主要分为Server层和存储 ...
- 一条 SQL 语句在 MySQL 中如何执行的
一 MySQL 基础架构分析 1.1 MySQL 基本架构概览 下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的. 先简单介绍一下下图 ...
- 一条SQL语句在MySQL中如何执行的
本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ...
- 原来select语句在MySQL中是这样执行的!看完又涨见识了!这回我要碾压面试官!
大家好,我是冰河~~ MySQL作为互联网行业使用最多的关系型数据库之一,与其免费.开源的特性是密不可分的.然而,很多小伙伴工作了很多年,只知道使用MySQL进行CRUD操作,这也导致很多小伙伴工作多 ...
- 深入学习MySQL 01 一条查询语句的执行过程
在学习SpringCloud的同时,也在深入学习MySq中,听着<mysql45讲>,看着<高性能MySQL>,本系列文章是本人学习过程的总结,水平有限,仅供参考,若有不对之处 ...
- Hive通过查询语句向表中插入数据注意事项
最近在学习使用Hive(版本0.13.1)的过程中,发现了一些坑,它们或许是Hive提倡的比关系数据库更加自由的体现(同时引来一些问题),或许是一些bug.总而言之,这些都需要使用Hive的开发人员额 ...
- Hive通过查询语句向表中插入数据过程中发现的坑
前言 近期在学习使用Hive(版本号0.13.1)的过程中,发现了一些坑,它们也许是Hive提倡的比关系数据库更加自由的体现(同一时候引来一些问题).也许是一些bug.总而言之,这些都须要使用Hive ...
- 原来一条select语句在MySQL是这样执行的《死磕MySQL系列 一》
前言 看到蒋老师的第一篇文章后就收货颇丰,真是句句戳中痛点. 令我记忆最深的就是为什么知道了一个个技术点,却还是用不好 ?不管是蒋老师所说的Redis还是本系列要展开学习的MySQL. 这是一个值得思 ...
- 当执行一条查询语句时,MySQL内部经历了什么?
假如说我们有一张表 T ,表里只有一个字段 ID,当我们执行下边这条SQL语句时: mysql> select * fron T where ID=10; 在我们眼中能看到的只是输入一条 SQL ...
随机推荐
- Vue-cli中axios传参的方式以及后端取的方式
0917自我总结 Vue-cli中axios传参的方式以及后端取的方式 一.传参 params是添加到url的请求字符串中的,用于get请求. data是添加到请求体(body)中的, 用于post请 ...
- .Net Core API使用ODP.NET操作Oracle数据库
.Net Core API使用ODP.NET操作Oracle数据库 1.下载Oracle.ManagerDataAccess.Core. 右键依赖项——管理NuGet程序包. 在浏览选项中查询Orac ...
- C 自删除技术---批处理方式
#include<stdio.h> #include<windows.h>#pragma comment(linker, "/subsystem:\"win ...
- 为程序员节日献礼--2019中国.NET开发者峰会主题内容发布
2019年10月24日,组委会正式发布了China .NET Conf 2019中国 .NET 开发者峰会的主题内容. 2014年微软组织并成立.NET基金会,微软在成为主要的开源参与者的道路上又前进 ...
- echarts折线图动态改变数据时的一个bug
echarts折线图中当增加dataZoom,修改start大于0的时候,会出现折线混乱,变成竖直的线,绘制有问题. 解决方法,在dataZoom中增加filterMode: 'empty' http ...
- windows 系统对应的内核版本和自带 iis 版本
Windows 10 10.0* Windows Server 2016 10.0* Windows 8.1 6.3* Windows Server 2012 R2 6.3* Windows 8 6. ...
- java 连续数字数组分组
问题: 1. 将Lis list = Arrays.asList(1,2,3,5,8,9,10), 拆分成 [1,2,3] .[5]. [8,9,10] , 2. 再传入一个数字 9, 将匹配数字9的 ...
- 百万年薪python之路 -- MySQL数据库之 常用数据类型
MySQL常用数据类型 一. 常用数据类型概览 # 1. 数字: 整型: tinyint int bigint 小数: float: 在位数比较短的情况下不精确 double: 在位数比较长的情况下不 ...
- 惊人!Spring5 AOP 默认使用Cglib ?从现象到源码深度分析
Spring5 AOP 默认使用 Cglib 了?我第一次听到这个说法是在一个微信群里: 真的假的?查阅文档 刚看到这个说法的时候,我是保持怀疑态度的. 大家都知道 Spring5 之前的版本 AOP ...
- (day31) Event+协程+进程/线程池
目录 昨日回顾 GIL全局解释器锁 计算密集型和IO密集型 死锁现象 递归锁 信号量 线程队列 FOFI队列 LIFO队列 优先级队列 今日内容 Event事件 线程池与进程池 异步提交和回调函数 协 ...