当前位置: 首页 > news >正文

【MySQL 基础篇】深入解析MySQL逻辑架构与查询执行流程

在这里插入图片描述

1 MySQL逻辑架构概述

MySQL 的逻辑架构主要分为 Server 层和存储引擎层两部分。

  1. Server 层:包含连接器、查询缓存、分析器、优化器、执行器等组件。同时,所有的内置函数(如日期、时间、数学和加密函数等)也在这一层实现。此外,存储过程、触发器、视图等功能也由 Server 层来完成。
  2. 存储引擎层:负责数据的存储和提取,其架构模式是插件式的。常见的存储引擎有 InnoDB、MyISAM、Memory 等,从 MySQL 5.5.5 版本开始,InnoDB 成为了默认的存储引擎。

MySQL基本架构示意图

2 SQL查询语句执行流程

2.1 连接器

  • 功能:负责跟客户端建立连接、获取权限、维持和管理连接。

  • 连接命令mysql -h$ip -P$port -u$user -p,密码若直接跟在 -p 后面存在密码泄露风险。

  • 权限相关:用户名和密码认证通过后,连接器会从权限表中查出用户拥有的权限。连接中的权限判断依赖于此时读取的权限,修改用户权限不会影响已存在连接的权限。

  • 查看连接状态命令:show processlist,若结果中的 Command 列显示为“Sleep”的这一行,就表示现在系统里面有一个空闲连接。
    在这里插入图片描述

  • 连接空闲:连接空闲时间由参数 wait_timeout 控制,默认值为 8 小时。连接断开后,客户端再次发送请求会收到错误提醒。可通过show variables like "wait_timeout"查看连接超时时间。
    在这里插入图片描述

  • 长连接:为减少建立连接的开销,建议使用长连接,但长连接可能导致内存占用过大。解决方法有定期断开长连接,或者在 MySQL 5.7 及更新版本中执行 mysql_reset_connection 来重新初始化连接资源。

2.2 查询缓存

  • 执行流程:MySQL 拿到查询请求后,会先到查询缓存中查找,若能找到对应的语句,则直接返回结果;若没有命中缓存,则进入后续执行阶段,执行完成后,结果会被存入查询缓存。
  • 使用建议:由于查询缓存失效频繁(只要对表进行更新,该表上所有的查询缓存都会被清空),所以大多数情况下不建议使用。可以将参数 query_cache_type 设置成 DEMAND,实现按需使用。也可以在语句中用 SQL_CACHE 显式指定使用查询缓存。需要注意的是,MySQL 8.0 版本直接删除了查询缓存功能。
mysql> select SQL_CACHE * from T where ID=10

在这里插入图片描述

2.3 分析器

  • 词法分析:对输入的 SQL 语句进行分析,识别其中的字符串分别代表什么。
  • 语法分析:根据词法分析的结果,判断 SQL 语句是否满足 MySQL 语法。如果语句存在语法错误,会收到 “You have an error in your SQL syntax” 的错误提醒,并提示错误位置。

2.4 优化器

在表里面有多个索引的时候,决定使用哪个索引;在一个语句有多表关联(join)时,决定各个表的连接顺序,从而确定语句的执行方案。

2.5 执行器

  • 权限判断:先判断对表是否有执行查询的权限,如果没有权限,会返回没有权限的错误。
  • 执行过程:有权限则打开表,根据表的引擎定义,调用引擎提供的接口。对于没有索引的表,执行器会按行遍历表中的数据,判断条件是否满足;对于有索引的表,会调用相应的接口获取数据。
  • 扫描行数:执行器执行过程中会记录扫描的行数(rows_examined),需要注意的是,由执行器调用引擎获取数据行时累加,部分场景下引擎扫描行数跟 rows_examined 并不是完全相同的。

3 课后问题解答

当表 T 中没有字段 k,执行 select * from T where k=1 语句时,会报 “Unknown column ‘k’ in ‘where clause’” 的错误。

Answer:这个错误是在分析器阶段报出的,因为分析器的词法分析和语法分析会检查表名和字段名称是否存在等情况,当发现字段不存在时就会报错。

4 实际应用中的思考

在实际应用中,深入理解 MySQL 的架构和 SQL 查询语句的执行流程,对于优化查询性能、解决权限和语法相关问题具有重要意义。比如:

  • 根据业务场景选择合适的存储引擎,判断是否使用查询缓存;
  • 在开发过程中,重视分析器阶段的语法检查,减少因语法错误导致的问题;
  • 合理设计索引和表结构,利用优化器提高查询效率等。

5 参考链接

  1. MySQL 实战 45 讲

相关文章:

  • 苹果处理器“仿生“命名背后的营销策略与技术创新
  • 最短路和拓扑排序知识点
  • 零基础学Java——第十一章:实战项目 - 桌面应用开发(JavaFX入门)
  • How Sam‘s Club nudge customers into buying more
  • 【IPMV】图像处理与机器视觉:Lec11 Keypoint Features and Corners
  • 开源 Web Shell 工具
  • C语言学习之文件操作
  • zookeeper本地部署
  • 12-串口外设
  • Flutter到HarmonyOS Next 的跨越:memory_info库的鸿蒙适配之旅
  • 本地测试远程DM达梦数据库连接(使用DBeaver)
  • 砷化镓太阳能电池:开启多元领域能源新篇
  • 印刷业直角坐标型码垛机器人系统设计与应用研究
  • sql server 2019 将单用户状态修改为多用户状态
  • C++学习之打车软件git版本控制
  • React Native矢量图标全攻略:从入门到自定义iconfont的高级玩法
  • 【AAAI 2025】 Local Conditional Controlling for Text-to-Image Diffusion Models
  • 算法每日刷题 Day6 5.14:leetcode数组1道题,用时30min,明天按灵茶山艾府题单开刷,感觉数组不应该单算
  • hbase shell的常用命令
  • Kubernetes控制平面组件:Kubelet详解(三):CRI 容器运行时接口层
  • 男子入户强奸高龄独居妇女致其死亡,法院:属实,已执行死刑
  • 持续8年仍难终了的纠纷:败诉方因拒执罪被立案,胜诉方银行账户遭冻结
  • 中华人民共和国和巴西联邦共和国关于强化携手构建更公正世界和更可持续星球的中巴命运共同体,共同维护多边主义的联合声明
  • 国家林草局原党组成员、副局长李春良接受审查调查
  • 山西省委常委李金科添新职
  • 韩国总统选战打响:7人角逐李在明领跑,执政党临阵换将陷入分裂