MySQL | SQL 语句是怎样执行的呢?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 高产似母猪,废话少说,今天刚好读到一篇关于 MySQL 语句底层如何执行的文章,以下是我的理解,分享给你们。

简单的 SQL 语句


mysql> select * from User where ID=10086;


上面是一条非常简单的 SQL 查询语句,咋一看是不是觉得很简单,但却不懂它内部的执行流程?


根据自己的理解,我画了个不那么专业的执行流程图,先给出这条 SQL 语句的执行流程,再逐步解析每个流程,执行流程图如下:


640.jpg


你可以清晰地看到,MySQL 其实分为两层,server 层和存储引擎层。


server 层包括 连接器、查询缓存、分析器、优化器、执行器等,这一层涵盖了 MySQL 的大部分核心功能,包括你平时用到的很多函数。从图中可以看出,不同的引擎使用同一个 Server 层。


存储引擎层则是复制数据的存储和读取。由于在 MySQL 中,存储引擎是以插件形式存在的。所以它支持 InnDB、MySAM、Memory 等引擎,其中用得最多的就是 InnDB。


连接器


这条语句执行的第一步就是连接数据库,这时会调用连接器干这个事情。他负责跟客户端建立连接、获取权限、维持和管理连接。


连接命令一般是这么写的,相信不用我过多解释。


mysql -h 192.168.0.201 -P 3306 -u root -p123


输入这条命令之后最底层就是客户端与数据库之间进行经典的 TCP 握手通信,连接完成后,连接器就开始校验当前用户的身份。


  • 如果账号密码不对,就会抛出 Access denied for user 的异常。
  • 如果账号密码正确,连接器就会读取当前用户此时所拥有的的权限,值得注意的是,在连接过程中,即使你用管理员账号修改当前用户的权限,丝毫不会影响它在本次连接的权限,你的修改需要等到下次连接才会生效。
  • 如果你长时间没有操作数据库,这个连接自动断开,这个时间默认是 8 小时。这个时候你要操作数据库就必须重连。


如何取舍长连接和短连接?


长连接指的是数据库持续拥有一个连接,短连接指每次执行完很少的几次操作就断开连接。


但是有个问题,长连接临时使用的内存管理在连接对象中,如果使用长连接,内存占用太大导致 MySQL 重启,而连接本来就是一个非常复杂的操作(想想 TCP 通信),我们又不能使用短连接。那如何取舍呢?


可以考虑以下方案:


  1. 定期断开长连接,使用一段时间,或者程序里面判断占用内存较大时,断开连接。
  2. MySQL 5.7 以上版本,可以在执行一个大的操作后,运行 mysql_reset_connection 来初始化链接资源,这个过程并不需要重连,但还是会恢复到初始连接的状态。


查询缓存


若开启了查询缓存,之前执行过的语句会以 key-value 对的形式存在。典型应用就是 redis。


连接建立完成后,接下来,select 语句就是到查询缓存中判断是否有当前语句的缓存,若有直接返回结果集。


使用了查询缓存效率会很高。但一般不建议用,为什么?


为什么不建议用查询缓存?


查询缓存失效的频率非常高,只要有对表的更新,这个表的所有查询缓存就失效了,你辛苦存起来的缓存,还没使用就这么一下子就没了。对于经常更新的数据库来说,查询缓存根本没必要存在。除非你的表数据是不常变动的,建议你使用查询缓存。


分析器


如果没命中缓存就要开始执行语句了,但在执行之前 MySQL 需要知道你想干嘛。因此会对语句进行分析,这时就是分析器的活了。


首先 MySQL 会做词法分析,以上述语句为例,MySQL 就会识别出 select 关键字,分析这是查询语句,再把 User 识别成 表名 User,把字符串 "ID" 识别出 "列ID"。


优化器


经过分析器知道了做什么,在开始执行前还需要经过优化器。


它的作用就是在表里面有多个索引的时候。决定使用那个索引;或者在一个语句有多表关联的时候,决定各个表的连接顺序。优化器会选择效率最高的优化方案。


执行器


翻过万水千山终于来到了执行器,在开始执行之前,执行器会判断当前用户对表 User 是否有查询的权限。如果没有就报权限异常,(那如果当前用户没有权限,但命中了查询缓存,那 MySQL 会在返回结果时做权限认证)


如果有权限,执行流程如下(以上述语句为例):


  1. 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10086,如果不是则跳过,如果是则将这行存在结果集中。
  2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
  3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户。


至此执行结果完成。


后语


以上就是我对 MySQL 查询语句执行流程的理解,希望对你们有帮助。最后,对 Python 、Java 感兴趣请长按二维码关注一波,我会努力带给你们价值,如果觉得本文对你哪怕有一丁点帮助,请帮忙点好看,让更多人知道。如有问题或建议,请后台留言,我会尽力解决你的问题。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
2月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
319 11
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
11月前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
SQL 存储 关系型数据库
MySQL下使用SQL命令进行表结构与数据复制实践
MySQL下使用SQL命令进行表结构与数据复制实践
261 0
|
SQL 关系型数据库 MySQL
MySQl数据库第八课-------SQL命令查询-------主要命脉2
MySQl数据库第八课-------SQL命令查询-------主要命脉
192 0
|
SQL 关系型数据库 MySQL
MySQl数据库第八课-------SQL命令查询-------主要命脉 1
MySQl数据库第八课-------SQL命令查询-------主要命脉
208 0
|
SQL 存储 开发框架
MySQl数据库第六课-------SQl命令的延续------快来看看
MySQl数据库第六课-------SQl命令的延续------快来看看
180 0
|
SQL 存储 NoSQL
MySQl数据库第五课 --------在SQl的简单命令--------学习学习
MySQl数据库第五课 --------在SQl的简单命令--------学习学习
134 0

推荐镜像

更多