作为一名 Java开发人员,写 SQL 语句是常有的事,但是你知道 SQL 语句背后的处理逻辑吗?比如下面这条 SQL 语句:

select * from user where id=1

执行完这条语句后,我们就会得到 id 为 1 的用户信息。那么对于这一条 SQL 语句,MySQL服务器做了哪些处理呢?这篇文章我们就一起打卡 MySQL 数据库中对 SQL 语句的处理逻辑。

了解 MySQL 数据库的 SQL 语句内部处理逻辑有什么好处?当我们碰到 MySQL 的一些异常或者问题时,就能够直戳本质,更为快速地定位并解决问题。

想要更好的了解 SQL 语句的内部处理逻辑,我们可以先看 MySQL 的基本架构图,这样我们可以站在更高的角度去俯瞰 MySQL 数据库,MySQL 的基本架构示意图如下:

从图中,我们可以清晰的看出 MySQL 的架构和各个模块以及 SQL 语句的执行过程,MySQL 数据库整体可以分为 Server 层和存储引擎层两部分,其中 Server 层是共有的,而存储引擎层则是可以以插件的形式进行扩展。一条 SQL 语句大概会经历链接管理、解析与优化、最后到存储引擎,这三个模块。接下来我们就来聊一聊这三个模块。

连接管理

连接管理是 SQL 语句执行过程中碰到的第一关,链接管理就像一扇大门一样,控制着客户端与 Server 服务端的交互,连接管理主要工作是客户端的身份认证和连接线程的管理。

每个客户端与 Server 建立连接时,服务端都会创建一个线程来与客户端进行交互,交互的第一项内容就是验证客户端的身份,认证凭据是基于客户端发起连接请求时携带的主机信息、用户名、密码。如果认证失败,则结束连接任务,并且返回的 Access denied for user 错误。

如果认证成功,连接管理还会做一件事情,到权限表中查询出该用户的权限,在这次连接下,后续的权限判断都是基于此时读取的权限为依据,也就是说连接成功后,即使管理员对这个用户做了权限修改,也不会影响这次连接的权限验证。

连接管理需要做的事情就比较简单,主要是负责客户端与服务端进行连接,当然在连接线程上,连接管理也做了优化,并不是每个客户端执行完任务之后,就把该线程销毁,连接管理会把这些线程缓存起来,等待新的连接,这也就不会频繁的创建和销毁线程,从而节约了开销。

解析与优化

完成连接管理之后,SQL 语句执行的第二步就是解析和优化,这一步就非常的复杂,SQL 语句查询的所有操作都在这里了。我们可以将这一步细分为 4 小步。

查询缓存

在 MySQL 服务端也有缓存,这是一个非常鸡肋的功能,为什么呢?看完了你就知道了。

MySQL 服务器拿到查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。

看上去没毛病,这样做会大大提升 MySQL 的性能,然而,你想多了,MySQL 的查询缓存命中率非常的低,主要原因是如果两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中。

还有就是缓存有可能获取到错误的数据,以某些系统函数举例,可能同样的函数的两次调用会产生不一样的结果,比如函数NOW,每次调用都会产生最新的当前时间,如果在一个查询请求中调用了这个函数,那即使查询请求的文本信息都一样,那不同时间的两次查询也应该得到不同的结果,如果在第一次查询时就缓存了,那第二次查询的时候直接使用第一次查询的结果就是错误的!

除了这些之外,MySQL 缓存的失效也非常的频繁,MySQL的缓存系统会监测涉及到的每张表,只要该表的结构或者数据被修改,如对该表使用了 INSERT、 UPDATE、DELETE、TRUNCATE TABLE、ALTER TABLE、DROP TABLE 或 DROP DATABASE 语句,那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除!

看到这里你知道查询缓存很鸡肋了吧,缓存对 MySQL 数据库来说弊大于利,所以在 MySQL 8.0 版本直接将查询缓存的整块功能删掉了

语法解析和预处理

如果查询缓存没有命中,接下来就需要进入正式的查询阶段了。因为客户端程序发送过来的请求只是一段文本而已,所以 MySQL 服务器程序首先要对这段文本做语法解析。

首先通过关键字将 SQL 语句进行解析,并且生成一个“解析树”。MySQL 解析器将使用 MySQL 语法规则验证和解析查询,例如,关键字是否使用正确、关键字的顺序是否正确或者引号是否前后匹配等。

预处理是根据一些 MySQL 规则进一步检查解析树是否合法,例如数据表和数据列是否存在,还会解析名字和别名,看看他们是否有歧义等。

查询优化

语法解析和预处理之后,你的需求就明白了,需要查询哪张表,查询的数据列是哪些、条件是什么等等。但是使用怎么样的方式是最优查询方式呢?查询优化就是来干这个事的,MySQL 的优化程序会对我们的语句做一些优化,如外连接转换为内连接、表达式简化、子查询转为连接等等。优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的。

执行器

执行器会执行查询优化后的执行计划,通过与存储引擎交互,完成数据的查询操作,返回最终的数据结果。

开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误,如下所示 (在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用 precheck 验证权限)。

mysql> select * from user where ID=1;

ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'

如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

比如我们这个例子中的表 user 中,假设 ID 字段没有索引,那么执行器的执行流程是这样的:

1、调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;

2、调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

3、执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

到这里,执行 SQL 语句就执行完了,其实这内部还是非常复杂的。

存储引擎

到上面为止,SQL 语句就执行完了,但是与真实数据打交道的是存储引擎,存储引擎是 MySQL服务器对数据的存储和提取操作的封装模块。我们知道表是由一行一行的记录组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是存储引擎负责的事情。

为了实现不同的功能,MySQL提供了各式各样的存储引擎,不同存储引擎管理的表具体的存储结构可能不同,采用的存取算法也可能不同。比如,MySQL5.7 之后默认的 InnoDB 存储引擎。

mysql select from user_select * from user 这条 SQL 语句,背后藏着哪些不可告人的秘密?...相关推荐

  1. mysql查询成绩并排名_一条SQL语句实现查询出成绩名次排名

    需求描述: 成绩表 编号 姓名 成绩 1 张三 90 2 李四 85 3 王五 100 4 赵六 85 5 汪一 100 6 周九 78 7 何二 56 要求: 排下名次,因为这里有同分,所以必然会出 ...

  2. 一条SQL语句的千回百转

    点击▲关注 "数据和云"   给公众号标星置顶 更多精彩 第一时间直达 SQL语言相信大家都不陌生,从本质上来说,它是一种结构化查询语言,是用来数据库之间的通信的编程语言.作为一名 ...

  3. mysql select from user_select user,host from mysql.user; 这条查询语句到达mysql 从开始到结束到底经历了什么...

    mysqld 程序运行原理 mysqld 程序结构 连接层:执行上调语句 首先要连接到数据库 连接层 1.提供链接协议(连接的方法) socket(方法1 本地连接) TCP/IP(方法2 远程连接) ...

  4. mysql数据库会同时执行sql吗_mysql 一次执行多条sql语句

    最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...

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

    来源:http://t.cn/E6U9Z9T 概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架 ...

  6. 面试题:一条 sql 语句是如何经过 MySQL 的体系结构的?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:有了这 4 款工具,老板再也不怕我写烂SQL了个人原创+1博客:点击前往,查看更多 作者:李福春 来源:http ...

  7. mysql怎么刷题_面试刷题mysql1:一条sql语句是如何经过mysql的体系结构的?

    {port} -u${user} -p ,输入密码. 使用连接器连接服务端: 连接成功之后,权限修改不会影响当前连接,连接的有效期默认是8个小时: 连接之后,执行过程中使用内存会持续增加,应该定时重置 ...

  8. 解析MySQL基础架构及一条SQL语句的执行流程和流转

    前言 本篇文章分析SQL语句在MySQL中的执行流程,包括SQL的查询在MySQL内部会怎么流转,SQL语句的更新是怎么完成的.在分析之前我们一起看看MySQL的基础架构,知道了 MySQL由那些组件 ...

  9. linux sql命令行查询语句不要换行_面试刷题mysql1:一条sql语句是如何经过mysql的体系结构的?...

    mysql执行一条sql查询语句背后发生了什么呢? 我是李福春,我在准备面试,今天的题目是: mysql的体系结构是怎样的?一条sql语句在mysql的体系结构中经历了什么? 答: mysql体系结构 ...

最新文章

  1. 渲染测试软件 d15,D5 Render(D5 渲染器)1.7.0 正式版发布 | 一款 RTX 实时光线追踪可视化实时渲染引擎,而且是国产软件!...
  2. Maven添加Oracle的依赖及驱动
  3. 如何执行超过一百兆(100MB)的sql脚本?
  4. System.out.printf()的使用方法
  5. Markdown:VS Code中预览markdown的快捷键和markdown的简单语法
  6. 推荐10本大数据领域必读的经典好书(火速收藏)
  7. 通过--amend和rebase修改git commit提交的注释信息
  8. 小结大学计算机基础课程内容报告,WORD制作新年贺卡和个人简历大学计算机基础课程设计报告书...
  9. 孔雀东南飞用mysql存储_孔雀东南飞的故事简介800字(孔雀东南飞主要内容介绍)...
  10. 有利可图网_第一章:有利可图的项目手册
  11. AAAI 2023 | CF-ViT:由粗到细的两阶段动态推理架构
  12. 在Linux上使用7z的最高压缩比来压缩文件
  13. 对WEB安全工程师的理解
  14. python一些运维模块熟悉
  15. 怎样将AutoCAD图转换成jpg等图片格式
  16. 网易考拉涉假疑案最新进展:雅诗兰黛中国承认没有鉴定真假的仪器
  17. AntV G6的相关使用总结
  18. 水文分析--arcgis水文分析模块
  19. Windows下使用任务计划程序实现宽带开机自动拨号和断线自动重连
  20. 软考中级到高级我都是怎么考的

热门文章

  1. Nginx反向代理汇总
  2. RocketMq配置rocketmq-console控制台管理账号密码
  3. UI设计中置灰功能总结
  4. python中shelf对象_Python对象持久化存储工具pickle
  5. 华为MH5000模块知识应用简介
  6. 小红书用户画像分析_用户画像,该怎么分析?
  7. 京东平台小家电用户画像分析报告
  8. [转]全渠道营销:一种新战略
  9. C++数组能开多大?
  10. 陆金所金融核心场景数据库的去 O 之路