《MySQL高级篇》二、逻辑架构分析(二)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 《MySQL高级篇》二、逻辑架构分析

2.1.3 优化器


在优化器中会确定 SQL 语句的执行路径,比如是根据 全表检索 ,还是根据 索引检索 等。


经过了解析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。一条查询可以有很多种执行方式,最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。


举例:如下语句是执行两个表的 join:


select * from test1 join test2 using(ID)
where test1.name='zhangwei' and test2.name='mysql高级课程';
方案1:可以先从表 test1 里面取出 name='zhangwei'的记录的 ID 值,再根据 ID 值关联到表 test2,再判断 test2 里面 name 的值是否等于 'mysql高级课程'。
方案2:可以先从表 test2 里面取出 name='mysql高级课程' 的记录的 ID 值,再根据 ID 值关联到 test1, 再判断 test1 里面 name的值是否等于 zhangwei。
这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。优化
器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。
如果你还有一些疑问,比如优化器是怎么选择索引的,有没有可能选择错等。后面讲到索引我们再谈。

在查询优化器中,可以分为 逻辑查询 优化阶段和 物理查询 优化阶段。


逻辑查询优化就是通过改变SQL语句的内容来使得SQL查询更高效,同时为物理查询优化提供更多的候选执行计划。通常采用的方式是对SQL语句进行等价变换,对查询进行重写,而查询重写的数学基础就是关系代数。对条件表达式进行等价谓词重写、条件简化,对视图进行重写,对子查询进行优化,对连接语义进行了外连接消除、嵌套连接消除等。


物理查询优化是基于关系代数进行的查询重写,而关系代数的每一步都对应着物理计算, 这些物理计算往往存在多种算法,因此需要计算各种物理路径的代价,从中选择代价最小的作为执行计划。在这个阶段里,对于单表和多表连接的操作,需要高效地使用索引,提升查询效率。


2.1.4 执行器

截止到现在,还没有真正去读写真实的表,仅仅只是产出了一个执行计划。于是就进入了 执行器阶段


a351d13fa9e12d35ff40d62a48761148.png


在执行之前需要判断该用户是否具备权限 。如果没有,就会返回权限错误。如果具备权限,就执行 SQL 查询并返回结果。在 MySQL 8.0 以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。

select * from test where id=1;

如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,调用存储引擎API对表进行的读写。存储引擎API只是抽象接口,下面还有个存储引擎层,具体实现还是要看表选择的存储引擎。


5ee1ff133c3986ae5e56f8eac1307a83.png


比如:表 test 中,ID 字段没有索引,那么执行器的执行流程是这样的:


调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是1,如果不是则跳过,如果是则将这行存在结果集中; 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

至此,这个语句就执行完成了。对于有索引的表,执行的逻辑也差不多。


SQL 语句在 MySQL 中的流程是:SQL 语句 → 查询缓存 → 解析器 → 优化器 → 执行器。

df75bb916190f7f541f3947740260dac.png


2.2 MySQL8中SQL执行原理


前面的结构图很复杂,我们需要抓取最核心的部分: SQL的执行原理。不同的DBMS的SQL的执行原理是相通的,只是在不同的软件中,各有各的实现路径。


既然一条SQL语句会经历不同的模块,那我们就来看下,在不同的模块中,SQL 执行所使用的资源(时间)是怎样的。如何在MySQL中对一条SQL语句的执行时间进行分析。

2.2.1. 确认profiling是否开启

了解查询语句底层执行的过程:select @@profiling; 或者show variables like '%profiling%' 查看是否开启计划。开启它可以让MySQL收集在SQL执行时所使用的资源情况,命令如下:

mysql> select @@profiling;
mysq1> show variables like 'profiling';

6a445100f115d534a881b34c16d093bd.png

profiling = 0代表关闭,我们需要把profiling打开,即设置为1;

mysql> set profiling = 1;


Profiling功能由MySQL会话变量:profiling控制。默认是OFF(关闭状态)。

2.2.2.多次执行相同SQL查询

mysql> select * from employees;
mysql> select * from employees;

2.2.3.查看profiles

mysql> show profiles #查询所有sql语句的分析概览


9d459ece9efe17273d4f53d0e36ab671.png

2.2.4.查看profile

mysql> show profie;


2142e9761b28d9f942ec1a4cb63521ba.png

 mysql> show profie for query Query_ID;# 查看某一次sql执行的分析过程

f6eaf6cb6b660d580e541da03324473c.png

b65ef704964cfda609589512e22a5d03.png

2.3 MySQL5.7中SQL执行原理

这里我们需要显示开启查询缓存模式。在MySQL5.7中如下设置:

2.3.1.配置文件中开启查询缓存

query_cache_type=1


2.3.2.重启Mysql服务

systemctl restart mysqld

2.3.3.开启查询计划

mysql> set profiling = 1;

2.3.4.执行语句两次

select * from departments;
select * from departments;


2.3.5.查看profiles

2fc7b52871a2d2f8b667cf15156e68cc.png


2.3.6.查看profile


90b3896c1518bd8ae4c03a990b8f04df.png

17de3864e85444c134f048bd9e43ba0f.png

结论不言而喻.执行编号10时,比执行编号9时少了很多信息,从截图中可以看出查询语句直接从缓存中获取数据 .

  • 注意1:SQL必须时一致的,否则,不能命中缓存.

例如:

#虽然查询结果一致, 但并没有命中缓存。
select * from mydb . mytbl where id=2
select * from mydb . mytbl where id>1 and id<3

**注意2:**同样的开启缓存的配置信息如果在MySQL8中添加。重启服务时会报错:

[ root@atguigu01 ~]# vim /etc/my.cnf
[root@atguigu01 ~]# systemctl restart mysqld;
Job for mysqld.service failed because the control process exited with error code. See
"systemctl status mysqld. service" and "journalctl -xe" for details.

分别在MySQL5.7和MySQL8中执行如下命令:

mysql> show variables like '%query_ cache%';


MySQL5.7中显示:

518eec8aa76c7d4e17f089ce6e4e0081.png

MySQL8.0中显示:c7b44f5556c8576c8577a99ca1c52f71.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
10月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
9月前
|
人工智能 API 数据安全/隐私保护
Apifox 与 Apipost 的 API 文档引擎对比:底层架构、性能与可扩展性分析
深入探索市场上两大主流API工具——Apifox和Apipost的文档能力时,发现了令人惊讶的差距。这不仅仅是功能多寡的问题,更关乎开发效率与团队协作的质变。
|
6月前
|
Java API 开发工具
灵码产品演示:软件工程架构分析
本演示展示灵码对复杂软件项目的架构分析与文档生成能力。通过Qwen3模型,结合PlantUML,自动生成系统架构图、微服务时序图,并提取API接口文档,实现高效、智能的代码理解与文档输出。
350 5
|
11月前
|
人工智能 自然语言处理 数据可视化
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
|
6月前
|
存储 JSON 数据处理
ClkLog埋点与用户行为分析系统:架构升级与性能全面提升
随着越来越多企业在实际业务中使用 ClkLog,数据规模和分析需求也不断提升,部分用户日活已经超过10万,为了顺应这一趋势,ClkLog 秉持 “开放透明、持续演进”的理念,推出了迄今为止最重要的一次性能优化升级。新版本在大规模数据处理与复杂查询场景中,性能表现实现了跨越式提升。经过多轮研发与严格测试,新版本现已正式上线:在原有付费版 1.0 的基础上架构全面升级,并同步发布全新的 2.0 版本。为用户带来更强的性能与更广的适用场景。
|
8月前
|
存储 移动开发 JavaScript
快应用推广连接底层技术与架构以及如何结合自身系统分销的推广逻辑和技术对接-优雅草卓伊凡|果果|Ant
快应用推广连接底层技术与架构以及如何结合自身系统分销的推广逻辑和技术对接-优雅草卓伊凡|果果|Ant
158 4
快应用推广连接底层技术与架构以及如何结合自身系统分销的推广逻辑和技术对接-优雅草卓伊凡|果果|Ant
|
10月前
|
机器学习/深度学习 人工智能 算法
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
该研究系统梳理了大型多模态推理模型(LMRMs)的技术发展,从早期模块化架构到统一的语言中心框架,提出原生LMRMs(N-LMRMs)的前沿概念。论文划分三个技术演进阶段及一个前瞻性范式,深入探讨关键挑战与评估基准,为构建复杂动态环境中的稳健AI系统提供理论框架。未来方向聚焦全模态泛化、深度推理与智能体行为,推动跨模态融合与自主交互能力的发展。
794 13
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
|
9月前
|
关系型数据库 MySQL 分布式数据库
Super MySQL|揭秘PolarDB全异步执行架构,高并发场景性能利器
阿里云瑶池旗下的云原生数据库PolarDB MySQL版设计了基于协程的全异步执行架构,实现鉴权、事务提交、锁等待等核心逻辑的异步化执行,这是业界首个真正意义上实现全异步执行架构的MySQL数据库产品,显著提升了PolarDB MySQL的高并发处理能力,其中通用写入性能提升超过70%,长尾延迟降低60%以上。
|
8月前
|
人工智能 搜索推荐 数据安全/隐私保护
快应用推广联盟分销逻辑及技术架构深度解析-优雅草卓伊凡|果果|Ant
快应用推广联盟分销逻辑及技术架构深度解析-优雅草卓伊凡|果果|Ant
238 2
|
7月前
|
存储 前端开发 JavaScript
如何开发设备管理系统中的经验分析报表板块 ?(附架构图+流程图+代码参考)
设备管理系统(EMS)助力企业高效管理设备生命周期,涵盖采购、维护到报废全流程。本文详解经验分析报表模块设计与开发,涵盖动态看板、点检、巡检、维修、保养及库存统计功能,提供代码示例与架构设计建议,提升设备管理效率与决策水平。

热门文章

最新文章

推荐镜像

更多