一条查询语句在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 ...
随机推荐
- python编程基础之三十七
数据的持久化:数据持久化就是将内存中的对象转换为存储模型,以及将存储模型转换为内存中的对象的统称. 对象可以是任何数据结构或对象模型,存储模型可以是关系模型.XML.二进制流等 Python的数据持久 ...
- 洛谷 P4170 [CQOI2007]涂色
题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:RGBGR. 每次你可以把一段连续的木版涂成一个 ...
- SQL SERVER数据库多条件查询
例如:查询挂号超500的数据select CONVERT(VARCHAR(10),DGH,23),COUNT(*) from yxhis2017..VTBMZGHMX2017 where bth=0 ...
- CSS定位机制:浮动 float及清除浮动的常用方法
CSS的定位机制 1.普通流(标准流) 默认状态,元素自动从左往右,从上往下排列 块元素的特征: 独占一行 可以设置宽高 如果不设置宽度,宽度默认为容器的100% 常见的块元素:div p h1-h6 ...
- 全球首个开放应用模型 OAM 开源 | 云原生生态周报 Vol. 23
作者 | 临石.元毅.冬岛.衷源.天元 业界要闻 全球首个开放应用模型 OAM 开源 2019 年 10 月 17 日,阿里巴巴合伙人.阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon ...
- Orecle基本概述(2)
1.视图1.1 视图介绍*一种虚拟的表,不是真实存在的表,以多种方式展示数据给用户看,1.2 视图使用*创建视图语法一(非只读): create or replace view 视图名字 as sql ...
- Linux之常用命令II
一.VI编辑器 1) 概述 ◆ Visual Interface(可视化接口): ◆ 类似Windows中的记事本,比记事本强大: ◆ VIM相对于VI做了哪些提升 -VIM支持多级撤销 -VI ...
- 项目代码管理工具Git的总结
在项目的开发中,代码的同步管理很重要,团队的几个人可以通过免费的github管理自己的开源项目代码,高效方便.下面说说,开发中经常用到的git指令操作,基于github平台. 0.配置提交者的账户和邮 ...
- sql事务的使用及其技巧整理
sql事务的使用及其技巧整理 概述: 在实际项目开发中,为了确保数据操作结果的一致性等要求,事务是一个必不可少的解决利器. 根据SQLSERVER实现原理,其实,SQLSERVER的每一条执行语句都是 ...
- B/S 端基于 HTML5 + WebGL 的 VR 3D 机房数据中心可视化
前言 在 3D 机房数据中心可视化应用中,随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的 ...