前言

我们在学习一种技术的时候,首先要鸟瞰其全貌,千万不要一开始就陷入到细节中去,这样有助于我们站在高维度其理解问题 —— 丁奇。

学习MySQL也是一样,所以我们可以从一条查询语句的执行开始看起。

select * from t where id = 1;

通常情况下,我们在使用MySQL的时候,只是从客户端输入一行指令,然后获取一个返回结果。
但是对于一个开发人员来说,只知道这些是远远不够的,我们还需要知道这句指令背后的执行流程,便于排查问题。

MySQL逻辑架构

这里还是引用丁奇老师的MySQL系统结构图:

 
mysql的逻辑架构图

MySQL可以分为Service层和存储引擎层两部分。

  • Service层又可分为:连接器、查询缓存、分析器、优化器、执行器。在MySQL中,跨存储引擎层的的功能都在这一层实现,如日期函数、存储过程、视图等。
  • 存储引擎层负责数据的存储和提取,是一个插件式的结构,一个Service可以对应多个存储引擎。常见的存储引擎有:InnoDB、MyISAM、Memory等。

连接器

连接器负责客户端与Mysql服务器的建立连接、获取权限、管理连接。连接命令一般是这么写的:

mysql -h$ip -P$port -u$user -p

如果用户名和密码校验通过后,连接器就会从权限表中查到该用户的权限。后续当该用户执行操作的时候,依赖的都是这个时候读取到的权限。

创建连接后,我们就可以使用 show processlist查看该连接:

 
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中是如何执行的?的更多相关文章

  1. 一条SQL语句在MySQL中是如何执行的

    概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 mysql主要分为Server层和存储 ...

  2. 一条 SQL 语句在 MySQL 中如何执行的

    一 MySQL 基础架构分析 1.1 MySQL 基本架构概览 下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的. 先简单介绍一下下图 ...

  3. 一条SQL语句在MySQL中如何执行的

    本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ...

  4. 原来select语句在MySQL中是这样执行的!看完又涨见识了!这回我要碾压面试官!

    大家好,我是冰河~~ MySQL作为互联网行业使用最多的关系型数据库之一,与其免费.开源的特性是密不可分的.然而,很多小伙伴工作了很多年,只知道使用MySQL进行CRUD操作,这也导致很多小伙伴工作多 ...

  5. 深入学习MySQL 01 一条查询语句的执行过程

    在学习SpringCloud的同时,也在深入学习MySq中,听着<mysql45讲>,看着<高性能MySQL>,本系列文章是本人学习过程的总结,水平有限,仅供参考,若有不对之处 ...

  6. Hive通过查询语句向表中插入数据注意事项

    最近在学习使用Hive(版本0.13.1)的过程中,发现了一些坑,它们或许是Hive提倡的比关系数据库更加自由的体现(同时引来一些问题),或许是一些bug.总而言之,这些都需要使用Hive的开发人员额 ...

  7. Hive通过查询语句向表中插入数据过程中发现的坑

    前言 近期在学习使用Hive(版本号0.13.1)的过程中,发现了一些坑,它们也许是Hive提倡的比关系数据库更加自由的体现(同一时候引来一些问题).也许是一些bug.总而言之,这些都须要使用Hive ...

  8. 原来一条select语句在MySQL是这样执行的《死磕MySQL系列 一》

    前言 看到蒋老师的第一篇文章后就收货颇丰,真是句句戳中痛点. 令我记忆最深的就是为什么知道了一个个技术点,却还是用不好 ?不管是蒋老师所说的Redis还是本系列要展开学习的MySQL. 这是一个值得思 ...

  9. 当执行一条查询语句时,MySQL内部经历了什么?

    假如说我们有一张表 T ,表里只有一个字段 ID,当我们执行下边这条SQL语句时: mysql> select * fron T where ID=10; 在我们眼中能看到的只是输入一条 SQL ...

随机推荐

  1. [JLOI2014]天天酷跑

    请允许我对记忆化搜索进行一个总结,我认为所有的搜索只要数据范围允许,都可以转化为记忆化搜索, 只是,用处的多与少的关系,其本身是求出设出状态之后,为求出当前状态进行递推(搜索),推到 已知状态,之后再 ...

  2. 手写OOXML文档——导出xlsx格式表格文档

    一.准备工作: 2个js库,另外把样式文件抽离出来 require('file-saver'); import JSZip from 'jszip' import {stylesData,theme1 ...

  3. Python_三元运算与lambda表达式

    [是什么] 三元运算是if...else...的简化版,lambda表达式是函数的简化版 三元运算(三目运算) # 判断两个数中的较大者 fun(a1,a2): return a1 if a1> ...

  4. Windows常用操作

    目录 查询IP地址 常用快捷键 显示文件后缀名 查询IP地址 1.进入到dos界面 2.输入命令: ipconfig 常用快捷键 快捷键 作用 win+E 打开计算机 win+R 打开运行 win+R ...

  5. ThinkPHP架构(一)-TP原理及路径问题及后台实现实例

    一直用CSDN的博客,由于域名当时注册写的不合适,现在想来博客园写博客,以后要坚持写啦,记录自己的技术学习路程 本人两个月前,刚完成基于PHP的研会门户网站,虽然实现了基本功能,但感觉技术有些单薄,便 ...

  6. PHP reset

    1.函数的作用:重置数组内部指针,并返回第一个元素 2.函数的参数: @param array  $array 3. 例子一: <?php $arr1 = []; $arr2 = [false, ...

  7. Luogu P2297 刷图 DP

    题目背景 loidc,LOI中的传说级哲♂学家,曾经创造一天内入坑maxlongint个弃坑0x7fffffff个的神奇纪录.目前,loidc最喜欢的游戏就是地下城与勇♂士. 题目描述 Loidc是一 ...

  8. SpringBootSecurity学习(26)前后端分离版之github单点登录

    单点登录(SSO) 关于oauth2.0,最后我们再来学习一下单点登录.前面介绍过单点登录的定义,单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一. ...

  9. 020 - FreeRTOS学习路线总结

    零.为什么写? 在H7-tools预售群里,有位朋友提出如何学习FreeRTOS这类的问题,便由此总结下自己的学习路线.最近又打算接触RTT,和FreeRTOS做个对比. 文章分两步来讲,学习路线和学 ...

  10. 在npm上发布自己的vue组件库(使用npm install 或者 CDN的方式引用)

    一.npm publish发布包到npm库的命令是npm publish npm publish发布包,需要先配置webpack.json文件,如果没有webpack.json文件,可以通过npm i ...