【MySQL实战笔记】01.一条SQL查询语句是如何执行的?

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【4月更文挑战第3天】MySQL执行SQL的流程包括连接器、查询缓存、分析器、优化器和执行器。连接器负责建立连接、权限验证,查询缓存(MySQL 8.0已移除)存储查询结果,分析器解析SQL确保语法正确,优化器选择最佳索引和查询路径,执行器执行查询并管理权限。连接器使用长连接可能导致内存问题,可定期断开或使用`mysql_reset_connection`。注意,更新操作会导致查询缓存失效。

一条SQL查询语句是如何执行的?

架构介绍

MySQL的基本架构图如下:
image-20240406201827814.png

MySQL分为Server层和存储引擎层两部分。

Server层包括连接器、查询缓存、分析器、优化器、执行器,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(比如日期、时间、数学和加密函数等),还有所有的跨存储引擎的功能都在这层实现(比如存储过程、触发器、视图等)

存储引擎层负责数据的存储和提取,是插件式的架构模式,支持InnoDB、MyISAM、Memory等多个存储引擎。自从MySQL5.5.5版本后,InnoDB成为了默认存储引擎。

执行过程

1.连接器

第一步先连接到数据库上,连接器负责跟客户端建立连接、获取权限、维持和管理连接。

连接命令如下:

mysql -h$ip -P$port -u$user -p

连接的时候,如果用户名密码认证通过,连接器会到权限表里查到拥有的权限。之后,这个连接里的权限判断逻辑,都依赖此刻查询到的权限。

这也意味着,一个用户成功建立连接后,如果用管理员账号对该用户的权限做了修改,也不会影响到已经存在连接的权限。修改完成后,只有新建的连接才会使用新的权限设置。

连接完成后,如果没有后续动作,该连接就处于空闲状态。客户端如果太久没有操作,连接器就会自动将它断开,这个时间由参数wait_timeout控制,默认8小时。连接被断开以后,客户端再次发送请求的话,就会收到一个错误提醒,提示进行重连。

建立连接的过程一般比较复杂,尽量使用长连接

全部使用长连接后,MySQL占用内存涨的特别快,因为MySQL在执行过程里,临时使用的内存都是管理在连接对象里的,只有在连接断开时才会被释放,所以长期累积下来,容易OOM。

解决这个问题的方案:

  1. 定期断开长连接
  2. MySQL5.7+版本,通过执行mysql_reset_connection来重新初始化连接资源。

2. 查询缓存

之前执行过的语句和结果以k-v键值对的形式被直接缓存在内存里,如果查询能够在缓存里找到这个key,value就会直接被返回给客户端。

如果语句不在查询缓存里,会执行后面的阶段。执行结束后,结果被存入查询缓存。

查询缓存的失效:只要有对一个表的更新,该表所有的查询缓存就会被清空。对于更新频繁的数据库来说,查询缓存的命中率非常低;只有很久时间才更新一次的静态表,才适合使用查询缓存。

参数设置: query_cache_type=DEMAND表示默认不使用查询缓存。如果确定要使用的话,需要使用SQL_CACHE显式指定,比如select SQL_CACHE * from T where ID=10;

版本更新: MySQL8.0 后没有查询缓存这个功能了

3. 分析器

先对SQL语句做解析。

分析器会先做"词法分析",需要识别出里面的字符串分别是什么、代表什么,同时,分析器会判断表是否存在、字段是否存在。然后做“语法分析”,根据词法分析的结果,语法分析器根据语法规则,判断输入的SQL语句是否满足语法。

4. 优化器

优化器式表里有多个索引的时候,决定使用哪个索引。或者在多表关联(join)的时候,决定各个表的连接顺序。

5. 执行器

开始执行语句的时候,先判断对这个表有没有执行查询的权限,没有的话显示没有权限的错误。有权限的话,打开表继续执行。打开表的时候,执行器会根据表的引擎定义,去使用该引擎提供的接口。

比如下面的查询语句

select * from T where ID=10;

如果表T里ID字段没有索引,那么执行流程是这样的:

  • 调用InnoDB引擎接口取这个表的第一行,判断ID值是否为10,如果不是的话就跳过,否则就存到结果集里
  • 调用引擎接口取下一行,重复相同的判断逻辑,直到取到这个表的最后一行
  • 执行器将上述过程里满足条件的所有行组成的结果集返回给客户端

如果有索引的话,第一次调用的是“满足条件的第一行”接口,之后循环取“满足条件的下一行”接口。

数据库的的慢查询日志里有rows_examined字段,表示这个语句执行过程中扫描了多少行。这个值是执行器每次调用引擎获取数据行的时候累加的。

但是有些场景下,执行器调用一次,引擎内部扫描多行,因此引擎扫描行数和rows_examined字段并不是完全相同。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
86 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
3天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
27 8
|
6天前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
46 11
|
10天前
|
存储 关系型数据库 MySQL
mysql怎么查询longblob类型数据的大小
通过本文的介绍,希望您能深入理解如何查询MySQL中 `LONG BLOB`类型数据的大小,并结合优化技术提升查询性能,以满足实际业务需求。
38 6
|
17天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
16天前
|
SQL 关系型数据库 MySQL
MySQL 高级(进阶) SQL 语句
MySQL 提供了丰富的高级 SQL 语句功能,能够处理复杂的数据查询和管理需求。通过掌握窗口函数、子查询、联合查询、复杂连接操作和事务处理等高级技术,能够大幅提升数据库操作的效率和灵活性。在实际应用中,合理使用这些高级功能,可以更高效地管理和查询数据,满足多样化的业务需求。
55 3
|
19天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
20天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
14天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
94 15
|
7天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。

热门文章

最新文章