高性能 MySQL(十):执行一个查询的过程

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
全局流量管理 GTM,标准版 1个月
简介: 当希望 MySQL 能够以更高的性能运行查询时,最好的办法就是搞清楚 MySQL 是如何优化和执行查询的。一旦理解这一点,很多查询优化工作实际上就是遵循一些原则,让优化器按照预想的方式运行。

a3613e003c3a09619992c41ae00a2272_image_auth_key=1686638246-jEWFr94PUnUj6LFVz9gqAN-0-468959d0fe8fe18f5b865f9b20f7dddf&file_size=58402.png

大家好,我是水滴~~

当希望 MySQL 能够以更高的性能运行查询时,最好的办法就是搞清楚 MySQL 是如何优化和执行查询的。一旦理解这一点,很多查询优化工作实际上就是遵循一些原则,让优化器按照预想的方式运行。

下图为 MySQL 执行一个查询的过程,我们一起看看它们的第一步都做的什么吧。

0e90cc30fcdd98b47d9f321162598eb6_image_auth_key=1686638257-5PCX515nL25HymDhHBs3Qv-0-e3122e08ae212e59121bc76de61daf71&file_size=160514.png


🌲 一、客户端/服务器通信协议

一般来说,我们不需要理解 MySQL 通信协议的内部细节,只需要大致理解通信协议是如何工作的。MySQL 客户端与服务端之间的通信协议是“半双工”的,这意味着,在任何一个时刻,要么是由服务器向客户端发送数据,要么是由客户端向服务器发送数据,这两个动作不能同时发生。

需要注意的一点是,当客户端从服务器取数据时,看起来是一个拉数据的过程,但实际上是 MySQL 服务器在向客户端推送数据的过程。

查询状态:对于一个 MySQL 连接,或者说一个线程,任何时刻只会有一个状态,该状态表示了 MySQL 当前正在做什么(可以通过show full processlist命令查看当前的状态)。

在一个查询的生命周期中,状态会变化很多次。下面是查询状态的列表:

  • Sleep:线程正在等待客户端发送新的请求。
  • Query:线程正在执行查询或者正在将结果发送给客户端。
  • Locked:在 MySQL 服务器端,该线程正在等待表锁。
  • Analyzing and statistics:线程正在收集存储引擎的统计信息,并生成查询的执行计划。
  • Copying to tmp table [on disk]:线程正在执行查询,并且将结果集都复制到一个临时表中(例如:执行 group by、文件排序或union操作)。如果这个状态后面还有“on disk”标记,那表示 MySQL 正在将一个内存中的临时表拷贝到磁盘上。
  • Sorting result:线程正在对结果集进行排序。
  • Sending data:这表示多种情况,线程可能在多个状态之间传送数据,或者在生成结果集,或者在向客户端返回数据。

了解这些状态的基本含义非常有用,这可以让你很快地了解当前查询执行的状态。若某个地方有了异常,也能很快地诊断出问题来。

🌲 二、查询缓存

在解析一个查询语句之前,如果查询缓存是打开的,那么 MySQL 会优先检查这个查询是否命中查询缓存中的数据。这个检查是通过一个对大小写敏感的哈希表实现的,如果没有匹配出缓存结果,那么查询会进入下一阶段的处理。

如果当前查询恰好命中了查询缓存,那么 MySQL 会直接从缓存中拿到结果并返回给客户端(在返回结果之前,MySQL 会检查一次用户权限,权限没问题会直接返回)。

🌲 三、查询优化处理

查询的生命周期的下一步,是将一个 SQL 转换成一个执行计划,这个过程称之为查询优化处理。这包括了多个子阶段:解析 SQL、预处理、优化 SQL 执行计划。

1. 语法解析器和预处理

首先,MySQL 通过关键字将 SQL 语句进行解析,并生成一棵对应的“解析树”。MySQL 解析器将使用请求规则验证和解析查询。

预处理则根据一些 MySQL 规则进一步检查解析树是否合法。例如,检查数据表和数据列是否存在、名称和别名是否有歧义等。下一步,预处理器还会验证权限。

2. 查询优化器

如果语法树是合法的,那么优化器会将其转化成执行计划。一条查询可以有很多种执行方式,它们的返回结果是相同的。优化器的作用就是找到这其中最好的执行计划。

3. 执行计划

和很多其他关系数据库不同,MySQL 并不会生成查询字节码来执行查询。MySQL 生成查询的一棵指令树,然后通过存储引擎执行完成这棵指令树并返回结果。最终的执行计划包含了重构查询的全部信息。

🌲 四、查询执行引擎

执行计划生成后,MySQL 的查询执行引擎则根据这个执行计划来完成整个查询。

相对于查询优化阶段,查询执行阶段不是那么复杂:MySQL 只是简单地根据执行计划给出的指令逐步执行。在该过程中,有大量的操作需要通过调用存储引擎实现的接口来完成,这些接口称为“handler API”。

为了执行查询,MySQL 只需要重复执行计划中的各个操作,直到完成所有的数据查询。

🌲 五、返回结果给客户端

查询执行的最后一个阶段是将结果返回给客户端。即使查询不需要返回结果集给客户端,MySQL 仍然会返回这个查询的一些信息,如该查询影响的行数。

如果查询可以被缓存,那么 MySQL 在这个阶段也会将结果存放到查询缓存中。

MySQL 将结果集返回给客户端是一个增量、逐步返回的过程。结果集中的每一行都会以一个满足 MySQL 客户端/服务器通信协议的封包发送,再通过 TCP 协议进行传输,在 TCP 传输过程中,可能对 MySQL 的封包进行缓存,然后指传输。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
23天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
2月前
|
存储 关系型数据库 MySQL
提高MySQL查询性能的方法有很多
提高MySQL查询性能的方法有很多
180 7
|
2月前
|
存储 关系型数据库 MySQL
提高MySQL的查询性能
提高MySQL的查询性能
74 4
|
1月前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
54 9
|
1月前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
72 3
|
1月前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
1月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
197 1
|
2月前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
1月前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
47 1
|
1月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
81 0