一条sql的执行流程

文章地址

https://blog.youkuaiyun.com/qq_43618881/article/details/118657040

连接器

请求先走到连接器,与客户端建立连接、获取权限、维持和管理连接

mysql缓存池

如果要查找的数据直接在mysql缓存池里面就直接返回数据

分析器

请求已经建立了连接,现在需要对请求的语法进行分析,生成一个语法树

如果语法不对在这里直接报错

优化器

在这里对你写的sql进行优化

比如说表连接查询的时候小表 left join 大表

最后生成执行计划

也就是explain出来的结果

执行器

随后将执行计划交给执行引擎进行操作,比如innodb存储引擎,mysql的存储引擎支持插件化

执行引擎

INNODB存储引擎,会对执行计划进行处理

INNODB缓存池

在INNODB里面也有缓存池,里面会有各种各样的脏页

INNODB流程

select

首先查看数据是否在缓存池当中,如果是的话直接对数据进行返回

如果不在缓存池当中从磁盘读取root 的下面的非聚簇索引页,根据slot,进行二分查找,最后按照偏移量找到对应的页表,如果下一个节点还是非聚簇节点,就重复这个步骤,如果不是非聚簇节点,就查找真正的数据

slot槽

slot槽在页头中,每个页都是有的

slot 记录了每一个页的偏移量,是一个数组的结构,可以支持二分查找

先从 B+Tree 的根开始,逐层检索,直到找到叶子节点,也就是找到对应的数据页为止,然后将数据页加载到内存中,页目录中的槽(slot)采用二分查找的方式先找到一个粗略的记录分组,最后在分组中通过链表遍历的方式查找到记录。

insert

先记录undo日志

修改buffer pool中的数据

        使用double write buffer 两次写进行持久化

        写redo log 

                redo log 根据设置的频率进行刷盘

                记录binlog

SQL语句的执行流程可以分为以下几个关键阶段,每个阶段在数据库系统中都有明确的任务和作用: ### 查询解析(Parsing) SQL语句首先会经过解析器(Parser)处理。解析器的主要任务是将SQL语句转换成一种内部表示形式,以便后续步骤(如优化和执行)能够处理。这一过程包括语法分析、语义检查以及权限验证[^2]。 - **语法分析**:确保SQL语句符合数据库的语言规范。 - **语义检查**:验证查询涉及的对象是否存在,并且用户具有相应的访问权限。 ### 查询优化(Optimization) 在解析完成后,优化器会介入。优化器的任务是生成一条高效的执行计划,以决定如何最好地检索或操作数据。这一步骤可能涉及索引选择、连接顺序优化等复杂逻辑。 如果该SQL语句之前已经被执行过,并且其执行计划仍然保留在缓存中,则可以直接跳过解析和优化阶段,直接使用现有的执行计划[^3]。 ### 执行计划生成与存储 当优化器确定了最佳执行计划后,这条SQL语句及其对应的执行计划会被存储在一个称为库缓存(library cache)的地方。这样做的好处是,当下次相同的查询再次出现时,就可以省略前面的解析和优化步骤,从而提高效率。 ### 查询执行(Execution) 执行器根据优化器生成的执行计划来调用存储引擎的API进行实际的数据读取或写入操作。存储引擎负责底层的数据管理,包括从磁盘读取数据、更新数据或将新数据插入到表中[^4]。 在此过程中,执行器可能会执行多种操作,例如: - 表连接(Join) - 数据排序(Order By) - 分组聚合(Group By) - 限制结果集大小(Limit) ### 结果返回与缓存(Result Return and Cache) 最后,查询的结果被返回给客户端。在MySQL 8.0之前的版本中,这些结果还可以被缓存,以便于未来相同查询更快地响应[^4]。 --- ### 示例代码:SQL语句执行流程模拟 以下是一个简单的Python示例,用于展示如何通过伪代码模拟SQL语句的执行流程: ```python class SQLExecutor: def parse_query(self, sql): print(f"Parsing query: {sql}") # 返回解析后的抽象语法树(AST) return {"type": "SELECT", "table": "users", "where": {"id": 1}} def optimize_plan(self, parsed_sql): print("Optimizing execution plan...") # 返回优化后的执行计划 return {"action": "SELECT", "from": parsed_sql["table"], "condition": parsed_sql["where"]} def execute_plan(self, execution_plan): print(f"Executing plan: {execution_plan}") # 模拟执行并返回结果 return [{"id": 1, "name": "Alice"}] def return_result(self, result): print("Returning result to client:") for row in result: print(row) # 创建执行器实例 executor = SQLExecutor() # 模拟SQL执行流程 sql = "SELECT * FROM users WHERE id = 1" parsed_sql = executor.parse_query(sql) execution_plan = executor.optimize_plan(parsed_sql) result = executor.execute_plan(execution_plan) executor.return_result(result) ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值