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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 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
AI 代码解读

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

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

连接完成后,如果没有后续动作,该连接就处于空闲状态。客户端如果太久没有操作,连接器就会自动将它断开,这个时间由参数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;
AI 代码解读

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

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

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

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

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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
3
3
0
108
分享
相关文章
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
【YashanDB知识库】如何将mysql含有group by的SQL转换成崖山支持的SQL
本文探讨了在YashanDB(崖山数据库)中执行某些SQL语句时出现的报错问题,对比了MySQL的成功执行结果。问题源于SQL-92标准对非聚合列的严格限制,要求这些列必须出现在GROUP BY子句中,而SQL:1999及更高版本允许非聚合列直接出现在选择列中。YashanDB和Oracle遵循SQL-92标准,因此会报错。文章提供了两种解决方法:使用聚合函数处理非聚合列,或将GROUP BY与ORDER BY拆分为两层查询。最后总结指出,SQL-92标准更为严谨合理,建议开发者遵循此规范以避免潜在问题。
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
83 9
MySQL的架构与SQL语句执行过程
MySQL架构分为Server层和存储引擎层,具有高度灵活性和可扩展性。Server层包括连接器、查询缓存(MySQL 8.0已移除)、分析器、优化器和执行器,负责处理SQL语句;存储引擎层负责数据的存储和读取,常见引擎有InnoDB、MyISAM和Memory。SQL执行过程涉及连接、解析、优化、执行和结果返回等步骤,本文详细讲解了一条SQL语句的完整执行过程。
106 3
join查询可以⽆限叠加吗?MySQL对join查询有什么限制吗?
大家好,我是 V 哥。本文详细探讨了 MySQL 中 `JOIN` 查询的限制及其优化方法。首先,`JOIN` 查询不能无限叠加,存在资源(CPU、内存、磁盘 I/O)、性能和语法等方面的限制。过多的 `JOIN` 操作会导致数据库性能急剧下降。其次,介绍了三种常见的 `JOIN` 查询算法:嵌套循环连接(NLJ)、索引嵌套连接(INL)和基于块的嵌套循环连接(BNL),并分析了它们的触发条件和性能特点。最后,分享了优化 `JOIN` 查询的方法,包括 SQL 语句优化、索引优化、数据库配置调整等。关注 V 哥,了解更多技术干货,点赞👍支持,一起进步!
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
MySQL下使用SQL命令进行表结构与数据复制实践
MySQL下使用SQL命令进行表结构与数据复制实践
185 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等