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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS Agent(兼容OpenClaw),2核4GB
简介: 【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字段并不是完全相同。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
8月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1357 152
|
8月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
977 156
|
8月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
8月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
8月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
785 11
|
7月前
|
SQL 关系型数据库 MySQL
(SQL)SQL语言中的查询语句整理
查询语句在sql中占了挺大一部分篇幅,因为在数据库中使用查询语句的次数远多于更新与删除命令。而查询语句比起其他语句要更加的复杂,可因为sql是数据库不可或缺的一部分,所以即使不懂,也必须得弄懂,以上。
396 0
|
8月前
|
关系型数据库 MySQL 索引
MySQL多表练习笔记
链接可行,多表查询语法
180 0
|
8月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
517 158
|
8月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
8月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
551 156

推荐镜像

更多