读丁奇mysql-01讲基础架构:一条SQL查询语句是如何执行的

MyBatis-plus执行自定义SQL 还有另外24篇MySQL+MyBatis+MyBatis-plus相关文章。 阅读详情

这是专栏的第一篇文章,我想来跟你聊聊MySQL的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个ID字段,在执行下面这个查询语句时:

mysql> select * from T where ID=10;

我们看到的只是输入一条语句,返回一个结果,却不知道这条语句在MySQL内部的执行过程。

所以今天我想和你一起把MySQL拆解一下,看看里面都有哪些“零件”,希望借由这个拆解过程,让你对MySQL有更深入的理解。这样当我们碰到MySQL的一些异常或者问题时,就能够直戳本质,更为快速地定位并解决问题。

下面我给出的是MySQL的基本架构示意图,从中你可以清楚地看到SQL语句在MySQL的各个功能模块中的执行过程。

MySQL的逻辑架构图

大体来说,MySQL可以分为Server层和存储引擎层两部分。

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

而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认存储引擎。

也就是说,你执行create table建表的时候,如果不指定引擎类型,默认使用的就是InnoDB。不过,你也可以通过指定存储引擎的类型来选择别的引擎,比如在create table语句中使用engine=memory, 来指定使用内存引擎创建表。不同存储引擎的表数据存取方式不同,支持的功能也不同,在后面的文章中,我们会讨论到引擎的选择。

从图中不难看出,不同的存储引擎共用一个Server层,也就是从连接器到执行器的部分。你可以先对每个组件的名字有个印象,接下来我会结合开头提到的那条SQL语句,带你走一遍整个执行流程,依次看下每个组件的作用。

连接器

第一步,你会先连接到这个数据库上,这时候接待你的就是连接器。连接器负责跟客户端建立连接、获取权限、维持和管理连接。连接命令一般是这么写的:

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

输完命令之后,你就需要在交互对话里面输入密码。虽然密码也可以直接跟在-p后面写在命令行中,但这样可能会导致你的密码泄露。如果你连的是生产服务器,强烈建议你不要这么做。

连接命令中的mysql是客户端工具,用来跟服务端建立连接。在完成经典的TCP握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。

  • 如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。
  • 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。

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

连接完成后,如果你没有后续的动作,这个连接就处于空闲状态,你可以在show processlist命令中看到它。文本中这个图是show processlist的结果,其中的Command列显示为“Sleep”的这一行,就表示现在系统里面有一个空闲连接。


客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数wait_timeout控制的,默认值是8小时。

如果在连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒: Lost connection to MySQL server during query。这时候如果你要继续,就需要重连,然后再执行请求了。

数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。

建立连接的过程通常是比较复杂的,所以我建议你在使用中要尽量减少建立连接的动作,也就是尽量使用长连接。

但是全部使用长连接后,你可能会发现,有些时候MySQL占用内存涨得特别快,这是因为MySQL在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是MySQL异常重启了。

怎么解决这个问题呢?你可以考虑以下两种方案。

  1. 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。

  2. 如果你用的是MySQL 5.7或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

查询缓存

连接建立完成后,你就可以执行select语句了。执行逻辑就会来到第二步:查询缓存。

MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果。如果你的查询能够直接在这个缓存中找到key,那么这个value就会被直接返回给客户端。

如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。你可以看到,如果查询命中缓存,MySQL不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。

但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。

查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。

好在MySQL也提供了这种“按需使用”的方式。你可以将参数query_cache_type设置成DEMAND,这样对于默认的SQL语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用SQL_CACHE显式指定,像下面这个语句一样:

mysql> select SQL_CACHE * from T where ID=10;

需要注意的是,MySQL 8.0版本直接将查询缓存的整块功能删掉了,也就是说8.0开始彻底没有这个功能了。

分析器

如果没有命中查询缓存,就要开始真正执行语句了。首先,MySQL需要知道你要做什么,因此需要对SQL语句做解析。

分析器先会做“词法分析”。你输入的是由多个字符串和空格组成的一条SQL语句,MySQL需要识别出里面的字符串分别是什么,代表什么。

MySQL从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“T”识别成“表名T”,把字符串“ID”识别成“列ID”。

做完了这些识别以后,就要做“语法分析”。根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法。

如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒,比如下面这个语句select少打了开头的字母“s”。

mysql> elect * from t where ID=1;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from t where ID=1' at line 1

一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接“use near”的内容。

优化器

经过了分析器,MySQL就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。比如你执行下面这样的语句,这个语句是执行两个表的join:

mysql> select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;
  • 既可以先从表t1里面取出c=10的记录的ID值,再根据ID值关联到表t2,再判断t2里面d的值是否等于20。
  • 也可以先从表t2里面取出d=20的记录的ID值,再根据ID值关联到t1,再判断t1里面c的值是否等于10。

这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。

优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。如果你还有一些疑问,比如优化器是怎么选择索引的,有没有可能选择错等等,没关系,我会在后面的文章中单独展开说明优化器的内容。

执行器

MySQL通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。

开始执行的时候,要先判断一下你对这个表T有没有执行查询的权限,如果没有,就会返回没有权限的错误,如下所示(在工程实现上,如果命中查询缓存,会在查询缓存放回结果的时候,做权限验证。查询也会在优化器之前调用precheck验证权限)。

mysql> select * from T where ID=10;

ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'

如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

比如我们这个例子中的表T中,ID字段没有索引,那么执行器的执行流程是这样的:

  1. 调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;

  2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

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

至此,这个语句就执行完成了。

对于有索引的表,执行的逻辑也差不多。第一次调用的是“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。

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

在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟rows_examined并不是完全相同的。我们后面会专门有一篇文章来讲存储引擎的内部机制,里面会有详细的说明。

小结

今天我给你介绍了MySQL的逻辑架构,希望你对一个SQL语句完整执行流程的各个阶段有了一个初步的印象。由于篇幅的限制,我只是用一个查询的例子将各个环节过了一遍。如果你还对每个环节的展开细节存有疑问,也不用担心,后续在实战章节中我还会再提到它们。

我给你留一个问题吧,如果表T中没有字段k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?分析器

表的字段不是数据,是事先定义好的,所以可以直接读取的,不需要在执行器打开表 oracle是这样,mysql受oracle影响

有个问题不太明白,为什么对权限的检查不在优化器之前做?

有些时候,SQL语句要操作的表不只是SQL字面上那些。比如如果有个触发器,得在执行器阶段(过程中)才能确定。优化器阶段前是无能为力的

1,连接
连接管理模块,接收请求;连接进程和用户模块,通过,连接线程和客户端对接
2,查询
查询缓存 Query Cache
分析器,内建解析树,对其语法检查,先from,再on,再join,再where......;检查权限,生成新的解析树,语义检查(没有字段k在这里)等
优化器,将前面解析树转换成执行计划,并进行评估最优
执行器,获取锁,打开表,通过meta数据,获取数据
3,返回结果
返回给连接进程和用户模块,然后清理,重新等待新的请求

wait_timeout 是客户端 非交互式的连接时间,如果程序连接mysql SERVER,是交互连接,关联的时间参数为interactive_timeout, 这两个时间参数需要尽量一致吗,一般设置多少合适?
query_cache_size 参数虽然不用了,我想确认下,关闭情况是 query_cache_size=0 要匹配参数query_cache_type=off吗? 还是直接query_cache_size=0 即可?

第一个问题:是的,这两个尽量设置成相同。值的话取决于业务。如果你面对的是成熟的开发(比如公司内部团队),可以设置小些,分钟级别就行。
第二个问题:这两个都可以,不过用query_cache_type会好些(代码判断路径更短)

CISSP/CCSP证书到手后别松懈!保姆级维持攻略:CPE积分怎么攒?年费怎么交? 本文为CISSP/CCSP持证者提供详细的维持认证攻略,重点介绍如何高效积累CPE积分和避免年费缴纳中的常见问题。通过免费与付费资源结合的策略,帮助持证者轻松完成年度认证要求,同时利用认证创造职业价值。 阅读详情

相关推荐

最新版IAR9.40和注册工具

IAR最新版的IDE在编译速度和代码提示等各个方面上都有很大提升,软件这个东西果然还是越新越好。之前的时候,IAR v9系列网上很多人都说能用,但是又没有把 IAR v9系列的注册方法写的很清楚,导致我一直都用注册老版本v8的方法去注册v9。结果注册后都会提示。

xue_nuo的博客 4万+

mybatis plus 执行sql

废话不多。 mapper @Select("${sqlStr}") List<MyTest> dynamicSql(@Param("sqlStr")String sql); 测试 @Autowired MyTestMapper myTestMapper; @Test public void DynamicSql() { String sql="select * from myTest"; List<MyT

正怒月神的博客 6646

保姆级教程:用GROMACS的FEP方法计算小分子结合自由能(附完整mdp配置)

本文提供了一份详细的GROMACS自由能微扰(FEP)计算教程,涵盖从系统准备、参数配置到结果分析的全流程。通过具体案例演示如何计算小分子结合自由能,包括λ窗口设计、动力学参数优化及并行化执行技巧,帮助研究者克服FEP计算中的常见问题,获得可靠的自由能数据。

weixin_30598225的博客 352

如何用Java校验SQL语句的合法性?有这5种解决方案

要在Java中校验SQL语句的合法性,可以使用JDBC API中提供的Statement接口的execute()方法。这个方法会尝试执行给定的SQL语句,如果SQL语句不合法,则会抛出一个SQLException异常。因此,我们可以利用这个异常来判断SQL语句的合法性。

pantouyuchiyu的博客 4075

手把手搭建你的第一个OCT仿真模型:用Python和光学仿真库重现A-SCAN信号

本文详细介绍了如何使用Python和光学仿真库搭建OCT仿真模型,重现A-SCAN信号。从环境配置、干涉仪建模到信号处理全流程,手把手教你实现光学相干层析成像的核心技术。通过代码示例和性能优化技巧,帮助开发者深入理解OCT原理并应用于医疗诊断等领域。

weixin_42562079的博客 240

Unity 编辑器篇|(一)MenuItem菜单栏

"一级菜单/二级菜单上/三级菜单""一级菜单/二级菜单中 %#_B""一级菜单/二级菜单下 %&_C""一级菜单/二级菜单中 %#_B""一级菜单/二级菜单下 %&_C""GameObject/二级菜单""CONTEXT/组件名/菜单名""一级菜单/二级菜单上 #_A""Assets/二级菜单""一级菜单/二级菜单下""一级菜单/二级菜单上""一级菜单/二级菜单中""一级菜单/二级菜单下""一级菜单/二级菜单下""一级菜单/二级菜单上""一级菜单/二级菜单中""一级菜单/二级菜单下""自定义/Test"

游戏开发小Y的博客 13万+

阿昌教你看懂mybatisplus的sql执行流程

前言 前置版本:MybatisPlus3.0.5 前些日子写了两篇关于mybatis相关的文章,一篇是《sqlSessionFactory的创建过程》,一篇是《sql语句的创建过程 》,看这篇,建议把上面两篇看了再来 (。・∀・)ノ゙ 这一次打算记录一下sql语句的执行流程,同样还是建议打开源码一起翻着对比看比较好 前戏 我们以如下代码开始入手:↓ public boolean isExist(VisitInfoTable item) { return baseMapper.selectC

阿昌爱Java 3720

RK3568移植AP6256

本文主要是记录RK3568移植正基的AP6256的WIFIBT模块,感兴趣的朋友可以一起学习!!!提示:以下是本篇文章正文内容,下面案例可供参考。

qq_24093081的博客 3715

MyBatis-Plus

MyBatis官方 MyBatis-Plus 概述 1.持久层框架 持久化:将程序的数据在持久状态与瞬时状态转化的过程,数据库和IO文件都是持久化(动作) 持久层:完成持久化操作的代码块(概念) 2.作用 简化JDBC,自动化存数据到数据库的过程 3.与MyBatis区别 MyBatis是持久层框架(开源),用于连接DB并支持增删改查,底层就是JDBC封装的组件访问数据库的 sql 语句存放于mapper(或Dao)包下的 xml 配置文件中 Mybatis-Plus是MyBatis的增强工具(只

weixin_51699336的博客 312

Python爬虫实战:携程/飞猪酒店信息爬取与动态价格分析

在当今数字化旅游时代,酒店预订平台的复杂筛选条件和动态定价机制为数据分析和价格监控带来了巨大挑战。本文将深入探讨如何使用最新的Python爬虫技术来抓取携程和飞猪平台的酒店信息,处理复杂的筛选条件,并解析动态价格数据。本文详细介绍了如何使用最新的Python爬虫技术来抓取携程和飞猪平台的酒店信息。通过结合httpxplaywrightparsel强大的反反爬虫能力:通过浏览器指纹伪装、请求签名、智能延迟等技术应对各种反爬措施高效的数据解析:使用CSS选择器和XPath精确提取所需信息灵活的数据存储。

2201_76125261的博客 414

YOLOv8模型轻量化实战:基于稀疏化剪枝与L1正则化的高效目标检测模型优化-附源码

本文提出一种YOLOv8轻量化方案,通过L1正则化稀疏化训练和动态阈值通道剪枝,在边缘计算场景中优化模型性能。方案分三步:首先通过L1正则诱导权重稀疏化并动态衰减系数;然后基于BN层权重统计进行通道剪枝,保留80%关键通道;最后对剪枝模型微调恢复精度。在COCO128数据集上验证,模型体积压缩40%,推理速度提升2.3倍,mAP仅下降0.4%,实现了精度与效率的平衡。该方案为移动端部署提供了可行的轻量化技术路径。

m0_64661770的博客 479

丁奇mysql45讲百度云下载_MySQL实战45讲,丁奇带你搞懂MySQL【完结】

开篇词.这一次,让我们一起来搞懂MySQL.mp3开篇词.这一次,让我们一起来搞懂MySQL.pdf01.基础架构:一条SQL查询语句是如何执行的?.mp301.基础架构:一条SQL查询语句是如何执行的?.pdf02.日志系统:一条SQL更新语句是如何执行的?.mp302.日志系统:一条SQL更新语句是如何执行的?.pdf03.事务隔离:为什么你改了我还看不见?.mp303.事务隔离:为什么你改了...

weixin_39922642的博客 1万+

Unity 佳能SDK 及数据获取

3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中。1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你。2. 将SDK这两个文件放到 Unity Plugins文件夹。

我知道你很急,但是路要一步步走 1475

丁奇mysql45讲百度云下载_丁奇-MySQL实战45讲 带你搞懂MySQL

MySQL实战45讲,从原理到实战,丁奇带你搞懂MySQL你将获得前阿里资深技术专家独家经验分享MySQL 核心技术详解与原理说明36个MySQL常见痛点问题解析完整的 MySQL学习路径课程目录开篇词.这一次,让我们一起来搞懂MySQL.mp3开篇词.这一次,让我们一起来搞懂MySQL.pdf01.基础架构:一条SQL查询语句是如何执行的?.mp301.基础架构:一条SQL查询语句是如何执行的?...

weixin_39756481的博客 6413

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MySQL实战45讲,丁奇带你搞懂MySQL【完结】

MySQL实战45讲,丁奇带你搞懂MySQL【完结】

软希网分享源码的博客 1791

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【MySQL实战45讲】01|基础架构:一条SQL查询语句是如何执行的?

MySQL大体上可分为Server层和存储引擎层两部分: Server层 连接器 / 查询缓存 / 分析器 / 优化器 / 执行器 / 内置函数 / 存储 / 触发器 / 试图等 存储引擎层 数据的存储和提取 / 插件式 / InnoDB(&amp;amp;gt;5.5 默认)/ MyISAM / Memory 连接器 负责与客户端建立连接、获取权限、维持和管理链接。成功建立连接后,即使修改权限也要重新连接后才...

管先森的博客 1454

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

mysql 45讲读书笔记 1 一条SQL查询语句是如何执行的之基础架构

一 序: 之前看了mysql的书,比如《高性能mysql》《innodb引擎揭秘》等,感觉看书偏理论,对比了下,还是极客时间里面的林晓斌老师讲的比较系统,有理论有注重常见的实践,关键是很多图画的很好,深入浅出。强烈推荐。我很多看过又忘了,还是整理一遍。 林晓斌,网名“丁奇”,前阿里资深技术专家,曾负责阿里云 RDS 内核开发团队和运维团队,并推动了 AliSQL 分支开源。作为活跃的 M...

bohu83的博客 547

83年,41岁大叔,MySQL大神创业再出发… 丁奇,加油!

【1】创业者我的又一个大龄程序员朋友,丁奇,创业了。据说,还是一人公司?画外音:丁奇,数据库内核专家,前腾讯云数据库负责人,国内数据库内核布道第一人。【2】同为技术人初识丁奇,纯属机缘巧合。2018年底,有个平台要做一个MySQL相关的课程,找到了我和丁奇。画外音:我估计,平台可能是看到我写过一些MySQL内核的文章。丁奇很快就提交了大纲:1. 一条查询语句是如何执行的2. 一条更新语句是如何执行...

shenjian58的博客 1773

MySQL45(丁奇)讲个人分析笔记--第1讲:01- MySQL基础架构

​ 在深入MySQL之前,不妨思考一下如下的sql语句是如何在MySQL执行的呢? select * from t where id = 10 想要清晰的了解这条语句在MySQL的内部执行流程,则必须要先了解MySQL的基础架构组成 如下图1.1是MySQL基础体系架构图: 正在上传…重新上传取消​编辑 图1.1 通过图1。 1可以看出,MySQL由以下几个部分组成: 1、客户端: 客户端连接器(...

wsy9600的博客 1885

《MySQL实战45讲》—基础篇(1-8讲)—学习记录

极客时间-林晓斌《MySQL实战45讲》 课程链接:《MySQL实战45讲》从原理到实战,丁奇带你搞懂MySQL 注:以下所有图片均来自极客时间《MySQL实战45讲》 01 | 基础架构:一条SQL查询语句是如何执行的? 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 Server层: 包括连接器,查询缓存,分析器,优化器和执行器等。所有跨存储引擎的功能都在这一...

远处 8538

01 | 基础架构:一条SQL查询语句是如何执行的?

这是专栏的第一篇文章,我想来跟你聊聊MySQL的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个ID字段,在执行下面这个查询语句时: mysql> select * from T where ID=10; 我们...

weixin_30379531的博客 70

MySQL实战45讲 - 01 | 基础架构:一条SQL查询语句是如何执行的?

alan711的博客 215

01-基础架构

文章目录基础架构(一条Sql语句是如何查询的?)一、原文连接器查询缓存分析器优化器执行器小结二、归纳2.1 分层架构2.2 组件功能2.3 MySql Server层和存储引擎层2.4 问题答案 基础架构(一条Sql语句是如何查询的?) MySql实战笔记是针对极客时间:《MySql实战45讲–从原理到实战,丁奇带你搞懂MySql》系列课程的学习和自我总结而成的读书笔记; 一、原文 你好,我是...

my_momo_csdn的博客 523

Msql 学习课程01-基础架构:一条SQL查询语句是如何执行的?

文章出自极客时间《MySQL 实战 45 讲》专栏,作者是前阿里资深技术专家丁奇 下面我给出的是MySQL的基本架构示意图,从中你可以清楚的看到SQL语句在MySQL的各个功能模块中执行的过程 大体来说,MySQL 可以分为Server层和存储引擎两部分。 Server层包括连接器,查询缓存、分析器、优化器、执行器,涵盖MySQL的大多数核心服务功能,以及所有的内置函数如(日期、时间、数...

szy_2565的博客 214

mysql foreach 写法,多条 sql 与一条 sql 的性能消耗分析

比如有 100 条 sql,如果不手动开启事务把这 100 条 sql 放在同一个事务中执行,那么这 100 条 sql 会分别在 100 个隐式事务中。每个事务占用一个连接,这样就占用了 100 个连接。

JellyfishMIX 的博客 1160

《MySQL实战45讲》——学习笔记01-03 “MySQL基本架构、日志系统、事务隔离“

《MySQL实战45讲》学习笔记01-03: 01 | 基础架构:一条SQL查询语句是如何执行的? 02 | 日志系统:一条SQL更新语句是如何执行的? 03 | 事务隔离:为什么你改了我还看不见?

娜娜米的博客 838
上一篇: MyBatis的discriminator鉴别器的作用
下一篇: Mysql binlog日志解析
qq_34412985
博客等级 码龄11年 143粉丝 983原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值