MySQL - 一条查询语句是怎么执行的?

一、执行流程

一条SQL语句,比如:SELECT * FROM users WHERE age > 18; 执行流程。

二、连接器

首先,这条SQL语句会来到MySQL的"大门"------连接器。连接器就像是一个门卫大叔,负责检查你的身份。它会验证你的用户名和密码,看看你是不是有权限进入这个数据库。

验证身份:连接器会检查你的用户名和密码是否正确。如果不对,它会直接把你拒之门外,就像你去参加一个高端派对,结果发现邀请函是假的,门卫大叔会毫不留情地把你拦在外面。

权限检查:如果你通过了身份验证,连接器还会检查你有没有执行这条SQL语句的权限。比如,你想查询users表,但你只有读取orders表的权限,那连接器会告诉你:"不好意思,你没有权限访问这个表!

"如果一切顺利,连接器会为你建立一个连接,并且这个连接会一直保持,直到你主动断开或者超时。这个连接就像是你和MySQL之间的"电话线",随时可以通话。

三、查询缓存

通过了连接器的检查,SQL语句接下来会来到查询缓存。查询缓存就像是一个"备忘录",MySQL会把之前执行过的查询结果缓存起来,方便下次直接使用。

缓存命中:如果你的SQL语句和之前某次查询一模一样,MySQL会直接从缓存中返回结果,省去了后续的复杂操作。这就像是你在考试前背了答案,考试时直接写上去,省去了思考的时间。

缓存未命中:但如果你的SQL语句是第一次执行,或者缓存中没有匹配的结果,MySQL就会继续往下执行。这时候,查询缓存就像是一个"摆设",没啥用。

不过,需要注意的是,MySQL 8.0之后,查询缓存功能被移除了。因为在实际应用中,查询缓存的命中率并不高,而且维护缓存还会带来额外的开销。所以,现在的MySQL已经不再依赖查询缓存了。

四、分析器

如果查询缓存没有命中,SQL语句就会来到分析器。分析器就像是一个"语法老师",它会检查你的SQL语句是否符合语法规则。

词法分析:分析器首先会进行词法分析,把SQL语句拆分成一个个的"单词"。比如,SELECT、*、FROM、users、WHERE、age、>、18,这些都会被识别为不同的"单词"。

语法分析:接下来,分析器会进行语法分析,检查这些"单词"是否符合SQL的语法规则。比如,SELECT后面必须跟着要查询的字段,FROM后面必须跟着表名,WHERE后面必须跟着条件等等。如果语法有问题,分析器会直接报错。

如果SQL语句通过了分析器的检查,MySQL就会生成一个"语法树",这个树结构就像是SQL语句的"骨架",后续的执行过程都会基于这个骨架进行。

五、优化器

通过了分析器的检查,SQL语句接下来会来到优化器。优化器就像是一个"聪明的管家",它会根据SQL语句的"骨架",决定如何执行这条SQL语句才是最有效率的。

选择执行计划:优化器会考虑多种执行方案,比如使用哪个索引、表的连接顺序等等。它会根据表的统计信息、索引的情况,选择出一个最优的执行计划。这就像是你在做旅行计划时,优化器会帮你选择最省时间、最省钱的路线。

索引选择:如果你的SQL语句中有WHERE条件,优化器会决定是否使用索引来加速查询。比如,age > 18这个条件,如果age字段上有索引,优化器可能会选择使用索引来快速定位符合条件的记录。

优化器的目标是让SQL语句执行得更快、更省资源。不过,优化器也不是万能的,有时候它也会做出错误的决定。这时候,你可能需要手动干预,比如通过FORCE INDEX来强制使用某个索引。

六、执行器

经过了优化器的"精心策划",SQL语句终于来到了执行器。执行器就像是一个"实干家",它会根据优化器生成的执行计划,真正地去执行这条SQL语句。

调用存储引擎:执行器首先会调用存储引擎的接口,准备读取数据。MySQL的存储引擎有很多种,比如InnoDB、MyISAM等,执行器会根据表的存储引擎类型,调用相应的接口。

读取数据:执行器会根据优化器选择的执行计划,逐步读取数据。比如,如果你的SQL语句中有WHERE条件,执行器会先读取符合条件的数据,然后再返回给客户端。

返回结果:最后,执行器会把查询结果返回给客户端。如果你使用的是命令行工具,结果会直接显示在屏幕上;如果你使用的是编程语言(比如Python、Java),结果会以数据结构的形式返回给你。

相关推荐
189228048615 分钟前
NX482NX486美光固态闪存NX507NX508
大数据·网络·数据库·人工智能·性能优化
有一个好名字1 小时前
从 3.6 亿订单表到毫秒级查询:分库分表指南
数据库·oracle
奥尔特星云大使4 小时前
MySQL 备份基础(一)
数据库·sql·mysql·备份·mysql备份
努力学习的小廉4 小时前
初识MYSQL —— 库和表的操作
数据库·mysql·oracle
浔川python社5 小时前
网络爬虫技术规范与应用指南系列(xc—1)
数据库·爬虫
代码不停6 小时前
计算机工作原理(简单介绍)
数据库·redis·缓存
偷心伊普西隆6 小时前
Python Access:删除数据库中指定的表和查询
数据库·python
小蒜学长6 小时前
springboot基于BS的小区家政服务预约平台(代码+数据库+LW)
java·数据库·spring boot·后端
简色7 小时前
预约优化方案全链路优化实践
java·spring boot·后端·mysql·spring·rabbitmq
zhangfeng11338 小时前
生物信息 R语言和 cytoscape 相互沟通的组件RCy3,构建cytoscape网络表 节点类型表 链接边的表,并推送到cytoscape
数据库·r语言·生物信息