从查询语句执行流程看MySQL架构

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 从查询语句执行流程看MySQL架构

前言


常言道,看待一个事情要先知全貌,从高维度认识、理解,然后再深入各个细节,一一击破。MySQL的学习也不例外,那么你知道一条SQL在MySQL中执行要经历哪些步骤吗?每个步骤都有MySQL的哪些“零件”参与吗?如果不清楚的话,可以阅读本文。


SQL执行流程


在MySQL客户端或者JAVA应用程序中查询一条最简单的语句比如select * from T where ID =10;你知道经历哪些步骤吗?

1671201828843.jpg


连接

你要执行查询语句前肯定要先和MySQL建立连接啊,那怎么建立连接呢?

可以通过下面的命令:

mysql -h ip -P port -u$user -p
  • 经过三次握手建立连接成功后, 验证客户端传来的连接用户名和密码,并不是任何阿猫阿狗都可以连啊
  • 如果用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行
  • 用户名密码认证通过,会从权限表查出账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限

这个用于连接的“零件”就是MySQL的连接器,它主要负责跟客户端建立连接、获取权限、维持和管理连接。


查缓存


现在连接建立好了,相当于客户端和MySQL服务端的“传输管道”有了,开始查数据了。

都说性能不够,缓存来凑,MySQL“为了性能”,也实现了查询缓存。

  • MySQL以查询的语句作为key去查询缓存中获取对应的value
  • 如果没有的话,会去做真实的查询
  • 如果有的话,直接返回缓存中的数据
  • 如果这个表发生更新,查询缓存会清空

所以关键点在于MySQL表的更新频率以及缓存的命中率,我们可以根据下面命令查看监控查询缓存:

show status like '%Qcache%';

1671201844539.jpg

  • Qcache_hits: 表示有 多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。
  • Qcache_inserts: 表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这也正常。

这上面一个过程就是MySQL的查询缓存操作。

但是实际情况是查询缓存往往弊大于利,因为查询缓存的失效非常频繁,一般建议大家在静态表里使用查询缓存。但是在MySQL 8.0中已经去掉了查询缓存。


分析验证


如果没有命中查询缓存,就要开始真正去查了。在查询前,MySQL肯定要“理解”你这条SQL语句啊,所以要有个“零件”去分析验证你的SQL语句,那究竟是怎么个分析过程呢?

  1. 词法分析, 你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面 的字符串分别是什么,代表什么。
  2. 语法分析,根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足 MySQL语法。

这也是为什么我们的SQL语句存在语法问题的时候会报错,就是这个叫做分析器的零件报出来的。

1671201855854.jpg


优化


语法没问题,就够了吗?当然不够,智能的MySQL还要帮我们做优化,那都做哪方面的优化呢?

  1. 比如有多个索引的时候,智能选择一个它认为最佳的索引
  2. 多表关联的时候,决定表的连接顺序
  3. 对子查询进行优化
  4. 对连接语义进行了外连接消除、嵌套连接消除....

这个过程就是由MySQL的优化器做的。


执行


优化器阶段完成后,这个语句的执行方案就确定下来了,然后真正的开始执行了。

在执行之前需要判断该用户是否具备权限 。如果没有,就会返回权限错误。如果具备权限,就执行 SQL 查询并返回结果。

我们以一开始的查询语句select * from T where ID =10;为例,ID没有索引,并且采用的innoDB作为存储引擎,整体查询的流程如下:

  • 调用 InnoDB 存储引擎接口取这个表的第一行,判断 ID 值是不是1
  • 如果不是则跳过
  • 如果是则将这行存在结果集中
  • 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户,这一个过程就是由MySQL的执行器执行的。


MySQL逻辑架构


上面讲解了查询语句的真个执行流程,涉及了MySQL的各个“零件”,我们将这些零件组装组装,可以形成下面的逻辑架构图:

1671201874103.jpg

大体来说,MySQL可以分为Server层存储引擎层两部分。

  • Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
  • 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDBMyISAMMemory 等多个存储引擎。所有的存储引擎都共用同一个Server层。


总结


本文通过以一个查询语句的执行流程为例,讲解了MySQL整体的逻辑架构,对MySQL的各个部分有了一个全局的认知。这样,在遇到问题的时候,也比较有针对性,比如对于一个select * from T where k=1,报了Unknown column ‘k’ in ‘where clause’的错误,我们就很快的知道是分析器报出来的,因为分析器会分析我们SQL的语法。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
24天前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
105 3
Mysql高可用架构方案
|
14天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
2月前
|
JSON JavaScript 前端开发
Vue3源码架构简析及Monorepo流程构建
【10月更文挑战第12天】Vue3源码架构简析及Monorepo流程构建
Vue3源码架构简析及Monorepo流程构建
|
20天前
|
SQL 存储 缓存
【赵渝强老师】MySQL的体系架构
本文介绍了MySQL的体系架构,包括Server层的7个主要组件(Connectors、Connection Pool、Management Service & Utilities、SQL Interface、Parser、Optimizer、Query Caches & Buffers)及其作用,以及存储引擎层的支持情况,重点介绍了InnoDB存储引擎。文中还提供了相关图片和视频讲解。
【赵渝强老师】MySQL的体系架构
|
1天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
22天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
49 9
|
24天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
56 3
|
29天前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
28天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
155 1
|
2月前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。