MySQL中一条SELECT语句是如何执行的

本文详细解析了SQL查询语句的语法与执行流程,包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY和LIMIT等关键字的作用及处理顺序。

查询操作是关系数据库中使用最为频繁的操作,也是构成其他SQL语句(如DELETE、UPDATE)的基础。

SELECT语法如下
(5)SELECT DISTINCT <select_list>                     

(1)FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate>

(2)WHERE <where_predicate>

(3)GROUP BY <group_by_specification>

(4)HAVING <having_predicate>

(6)ORDER BY <order_by_list>

(7)LIMIT n, m
SELECT语句的处理过程
  • FROM阶段
  • WHERE阶段
  • GROUP BY阶段
  • HAVING阶段
  • SELECT阶段
  • ORDER BY阶段
  • LIMIT阶段
FROM阶段

一条查询的sql语句先执行的是FROM table负责把数据库的表文件加载到内存中去

WHERE阶段

WHERE会把表中的数据进行过滤,取出符合条件的记录行,生成一张临时表

GROUP BY阶段

GROUP BY阶段按照指定的列名切分成若干临时表

HAVING阶段

该阶段根据HAVING子句中出现的谓词对虚拟表进行分组进行筛选

SELECT阶段

这个阶段是投影的过程,处理SELECT子句提到的元素

  • 计算SELECT列表中的表达式
  • 若有DISTINCT,则删除重复行
ORDER BY阶段

根据ORDER BY子句中指定的字段进行排序

LIMIT阶段

取出指定行的记录,产生临时表,并返回给查询用户

### 3.1 SQL 语句执行流程概述 MySQL一条 SQL 语句执行流程涉及多个模块的协作,包括连接器、查询缓存(已废弃)、解析器、优化器、执行器以及存储引擎等。以一个典型的 SELECT 查询为例: ```sql SELECT * FROM tb_student A WHERE A.age='18' AND A.name='张三'; ``` 该语句MySQL 中的执行流程大致如下: ### 3.2 连接与解析阶段 用户发起 SQL 请求后,首先由连接器验证身份并建立连接。随后,SQL 语句进入解析阶段,MySQL 会检查语句语法是否正确,并对表和列进行权限校验。若查询对象存在且权限合法,则继续向下处理[^1]。 ### 3.3 查询缓存(已弃用) 在 MySQL 8.0 之前,系统会尝试从查询缓存中查找是否有相同语句执行结果。如果命中缓存,则直接返回结果;否则进入优化和执行阶段。但此功能已在 MySQL 8.0 中移除,因此现代版本跳过此步骤[^1]。 ### 3.4 优化器生成执行计划 解析后的 SQL 语句交由优化器处理,优化器会根据统计信息选择最优的访问路径,生成执行计划。例如,决定是否使用索引、使用哪个索引、如何连接多表等。这个执行计划将作为后续执行器操作的依据[^1]。 ### 3.5 执行器调用存储引擎接口 执行器按照优化器生成的执行计划,调用存储引擎(如 InnoDB)提供的接口来访问数据。对于 SELECT 操作,执行器会遍历符合条件的数据页,必要时读取索引树并回表获取完整记录。 在此过程中,InnoDB 引擎负责具体的行级锁管理、事务控制以及 MVCC(多版本并发控制)机制的实现。同时,InnoDB 还会维护 redo log 和 undo log 来支持事务的 ACID 特性[^2]。 ### 3.6 日志系统的参与 对于更新类 SQL(INSERT、UPDATE、DELETE),除了 InnoDB 层面的日志(redo log、undo log)外,MySQL Server 层还会写入 binlog(二进制日志),用于主从复制和点恢复。为了保证 binlog 与 redo log 的一致性,MySQL 使用了两阶段提交机制(2PC)[^2]。 - **Prepare 阶段**:InnoDB 将事务的变更写入 redo log,并标记为“prepared”状态。 - **Commit 阶段**:MySQL Server 层将事务的 binlog 写入磁盘,完成后通知 InnoDB 提交事务,InnoDB 将 redo log 标记为“committed”。 这种机制确保即使在崩溃恢复时,也能通过两个日志的一致性判断事务最终状态,从而保证数据一致性和主从同步可靠性。 ### 3.7 结果返回与清理 查询类语句在完成数据检索后,会将结果集返回给客户端。如果是更新类语句,则在事务提交后释放相关锁资源,并将脏页异步刷新到磁盘。 在整个流程中,MySQL 各组件协同工作,确保 SQL 语句的正确执行与事务的完整性保障。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值