一条SQL是怎么执行的

简介: 本文介绍了MySQL中读写语句的处理流程。读语句涉及Server服务层和存储引擎层,其中Server层包括连接器、缓存器、分析器、优化器和执行器;写语句则更复杂,涉及redo log、undo log和binlog三大日志模块,以InnoDB引擎为例详细解析了写操作的具体步骤。

读语句:

对于读语句来说会经过Server服务层及存储引擎层

Server层会依次访问连接器,缓存器,分析器,优化器,执行器

ini

代码解读

复制代码

连接器     ->  用于校验请求源的身份标识及权限,你的连接方式可以是命令行、图形界面、不同编程语言所使用的MySQL连接器
    
    # 比如你遇到的1045 - Access denied for user就是由连接器在身份校验失败后抛出的异常
    # 当程序连接到MySQL后太长时间没有执行后续动作会被判定为Sleep状态(show processlist -> Command)连接器就会将连接客户端关闭(这个时间由wait_timeout参数决定),此时在次执行语句则会抛出异常(Lost connection to MySQL server during query)
    # 当连接成功后连接器会从权限表中查询当前连接用户所拥有的权限,如果在连接过程中被授予了新的权限并不会当即更新
    # 因为MySQL在执行过程中临时使用的内存是管理在连接对象里面的,所以在有多个长连接线程时服务器的内存占用会很高,此时最好可以定时断开后重连

缓存器     ->  用于缓存查询结果,下次执行SQL语句如果命中缓存则直接返回查询结果(MySQL8中已经废除了这个功能)

    # 当MySQL在内存缓存(你可以把它们理解key-value)中获取到SELECT语句执行结果则会直接返回结果给客户端而不在执行后续过程
    # 你可以使用 show variables like '%query_cache%' -> have_query_cache 查看是否开启了查询缓存
    # 如需开启查询缓存可在配置文件中[mysqld]下新增query_cache_size = 20M,query_cache_type = on即可
    # 除非是静态表很长时间不会更新数据,不然不建议使用缓存,因为只要是一旦这个表中内容被更新缓存也会随机失效,弊大于利
    
分析器     ->  用于SQL语句及词法分析

    # 比如你遇到的ERROR 1064 (42000) - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near xxxxx就是由分析器在校验语句失败后抛出的异常
    # 你也可以把分析器理解为一个路由调度器,不同的语句由分析器调度给下游
    # 当然,分析器还会抛出其他异常,如
        # ERROR 1054 (42S22): Unknown column '字段' in 'field list' 字段不存在
        # ERROR 1305 (42000): FUNCTION [database].[function] does not exist 函数不存在

优化器     ->  用于生成执行计划,选择索引(这部分只介绍读关于读语句的优化)
    
    # 优化器会在表中有多个索引(包括主键,单列,组合索引)时决定使用哪个索引,或者语句中出现多个表关联时决定各个表的连接顺序
    
执行器     ->  用于操作存储引擎获取最终查询结果
    
    # 在经过分析器知道要干什么及优化器知道要怎么干后执行器首先会判断这个连接用户对这些要查询的表有没有操作权限,如不存在会抛出异常(ERROR 1142 (42000): SELECT command denied to user 'xxx'@'xxx' for table 'xxx')
    
    # 以"select id, file1, file2, file3 from table where id = 100"语句为例,执行器的操作流程是这样的
    
        # 调用存储引擎的接口取这个表的第一行
        # 判断id如果是100则将这行加入结果集,不是则跳过
        # 重复这个逻辑直到最后一行(你可以在explain -> rows中看到执行器重复了多少次)

Server涵盖了MySQL大多数核心服务,如内置函数、存储过程、触发器、视图等

存储引擎层则取决于数据表在创建时选择的存储引擎

写语句:

注意:写语句的解释以InnoDB引擎为背景

对于写语句相对于读语句会稍微复杂,首先要知道MySQL的三个重要日志模块redo log(重做日志)、undo log(撤消日志)、binlog(归档日志),

redo log  - 重做日志(redo log能够保证MySQL在任何时间段突然奔溃,重启后以前提交的记录都不会丢失,也就是crash-safe功能)

perl

代码解读

复制代码

1):InnoDB是Innobase Oy公司所开发在以插件形式加入MySQL,InnoDB使用了redo log 来实现crash-safe能力,redo log是InnoDB引擎特有的
2):redo log记录的是结果,某个数据页某条记录做了什么修改,记录修改结果
3):redo log是循环写的,空间固定会用完,用完就刷盘再清空

undo log  - 撤销日志

bash

代码解读

复制代码

(1):undo log用于回滚事务,直接从undo log中取到原始值
(2):undo log根据不同的隔离级别获取到的数据是不同的

binlog  - 归档日志

arduino

代码解读

复制代码

1):binlog是MySQL的Server层实现的,所有引擎都可以使用
2):binlog并不具备crash-safe功能
3):binlog记录的是原始逻辑,也就是修改的过程,所以binlog只能用于归档
4):binlog是追加写入的,文件写到一定大小后会切换到下一个,不会覆盖之前的日志

然后,我们在来看MySQL写语句的执行顺序,与读语句相同的是写语句也会依次经过连接器、分析器、优化器、执行器,

不同点在于执行器层,以一条update语句为例

perl

代码解读

复制代码

1):执行器首先会调用引擎在Buffer Pool中读取数据,
                |
2):如果Buffer Pool中没有找到相关的数据则在磁盘中读取当前语句所需数据
                |
3):在undo log中写入更新前的旧值以便回滚数据
                |
4):更新Buffer Pool中的值
                |
5):将新的数据写入redo log Buffer
                | 
6):准备提交事务,出于prepare准备阶段,将修改写入redo log磁盘文件中
                |
7):准备提交事务,处于prepare准备阶段,将修改写入binlog磁盘文件
                |
8):提交事务,写入commit标记到redo log中,事务状态有prepare准备阶段修改为commit提交阶段
                |
9):后台线程读取Buffer Pool中的数据,定时将数据写入磁盘


转载来源:https://juejin.cn/post/7164308461897908232

相关文章
|
1天前
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
2024年11月29日,阿里云在上海举办金融量化策略回测Workshop,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。活动特别设计了动手实践环节,帮助参会者亲身体验阿里云产品功能,涵盖EHPC量化回测和Argo Workflows量化回测两大主题,旨在提升量化投研效率与安全性。
云上金融量化策略回测方案与最佳实践
|
14天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
7天前
|
自然语言处理 数据可视化 API
Qwen系列模型+GraphRAG/LightRAG/Kotaemon从0开始构建中医方剂大模型知识图谱问答
本文详细记录了作者在短时间内尝试构建中医药知识图谱的过程,涵盖了GraphRAG、LightRAG和Kotaemon三种图RAG架构的对比与应用。通过实际操作,作者不仅展示了如何利用这些工具构建知识图谱,还指出了每种工具的优势和局限性。尽管初步构建的知识图谱在数据处理、实体识别和关系抽取等方面存在不足,但为后续的优化和改进提供了宝贵的经验和方向。此外,文章强调了知识图谱构建不仅仅是技术问题,还需要深入整合领域知识和满足用户需求,体现了跨学科合作的重要性。
|
1月前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
2天前
|
人工智能 容器
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。
|
3天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
3289 15
|
7天前
|
Cloud Native Apache 流计算
PPT合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
3237 10
PPT合集|Flink Forward Asia 2024 上海站
|
20天前
|
人工智能 自然语言处理 前端开发
100个降噪蓝牙耳机免费领,用通义灵码从 0 开始打造一个完整APP
打开手机,录制下你完成的代码效果,发布到你的社交媒体,前 100 个@玺哥超Carry、@通义灵码的粉丝,可以免费获得一个降噪蓝牙耳机。
5891 16
|
1月前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
2天前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
345 32