mysql核心知识点

article/2025/7/27 15:59:47

在这里插入图片描述

Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。)都在 Server 层实现。

存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB,从 MySQL 5.5 版本开始, InnoDB 成为了 MySQL 的默认存储引擎。我们常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B+树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是 B+ 树索引。

第一步:连接器

连接的过程需要先经过 TCP 三次握手,因为 MySQL 是基于 TCP 协议进行传输的

如果用户密码都没有问题,连接器就会获取该用户的权限,然后保存起来,后续该用户在此连接里的任何操作,都会基于连接开始时读到的权限进行权限逻辑的判断。所以,如果一个用户已经建立了连接,即使管理员中途修改了该用户的权限,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。

MySQL 的连接也跟 HTTP 一样,有短连接和长连接的概念

第一种,定期断开长连接。既然断开连接后就会释放连接占用的内存资源,那么我们可以定期断开长连接。第二种,客户端主动重置连接。MySQL 5.7 版本实现了 mysql_reset_connection() 函数的接口,注意这是接口函数不是命令,那么当客户端执行了一个很大的操作后,在代码里调用 mysql_reset_connection 函数来重置连接,达到释放内存的效果。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

与客户端进行 TCP 三次握手建立连接;

• 校验客户端的用户名和密码,如果用户名或密码不对,则会报错;

• 如果用户名和密码都对了,会读取该用户的权限,然后后面的权限逻辑判断都基于此时读取到的权限;

第二步:查询缓存

对于更新比较频繁的表,查询缓存的命中率很低的,MySQL 8.0 版本直接将查询缓存删掉了,也就是说 MySQL 8.0 开始,执行一条 SQL 查询语句,不会再走到查询缓存这个阶段了。

第三步:解析 SQL

词法分析、语法分析

第四步:执行 SQL

每条SELECT 查询语句流程主要可以分为下面这三个阶段:• prepare 阶段,也就是预处理阶段;• optimize 阶段,也就是优化阶段;• execute 阶段,也就是执行阶段;

预处理:检查 SQL 查询语句中的表或者字段是否存在;• 将 select * 中的 * 符号,扩展为表上的所有列;

优化器:优化器主要负责将 SQL 查询语句的执行方案确定下来,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引。当然,我们本次的查询语句(select * from product where id = 1)很简单,就是选择使用主键索引。要想知道优化器选择了哪个索引,我们可以在查询语句最前面加个 explain 命令,这样就会输出这条 SQL 语句的执行计划,然后执行计划中的 key 就表示执行过程中使用了哪个索引,比如下图的 key 为 PRIMARY 就是使用了主键索引。

执行器:

  • 主键索引查询

使用主键索引查询一条记录,那么执行器与存储引擎的执行流程是这样的:

• 执行器第一次查询,会调用 read_first_record 函数指针指向的函数,因为优化器选择的访问类型为 const,这个函数指针被指向为 InnoDB 引擎索引查询的接口,把条件 id = 1 交给存储引擎,让存储引擎定位符合条件的第一条记录。

• 存储引擎通过主键索引的 B+ 树结构定位到 id = 1的第一条记录,如果记录是不存在的,就会向执行器上报记录找不到的错误,然后查询结束。如果记录是存在的,就会将记录返回给执行器;

• 执行器从存储引擎读到记录后,接着判断记录是否符合查询条件,如果符合则发送给客户端,如果不符合则跳过该记录。

• 执行器查询的过程是一个 while 循环,所以还会再查一次,但是这次因为不是第一次查询了,所以会调用 read_record 函数指针指向的函数,因为优化器选择的访问类型为 const,这个函数指针被指向为一个永远返回 - 1 的函数,所以当调用该函数的时候,执行器就退出循环,也就是结束查询了。

const 是 MySQL 优化器判定的一种访问类型(Access Type),表示查询结果最多只有一行数据,且这一行数据在查询执行阶段可以被视为 “常量”。

  • 核心特点

    • 通过主键索引唯一索引等值条件(如 WHERE id = 123)直接定位到唯一记录。

    • 优化器在执行查询前即可确定具体的行,无需逐行扫描或二次查找。

    • 访问类型的优先级极高,属于最优等级的查询方式之一。

  • 全表扫描

执行器第一次查询,会调用 read_first_record 函数指针指向的函数,因为优化器选择的访问类型为 all,这个函数指针被指向为 InnoDB 引擎全扫描的接口,让存储引擎读取表中的第一条记录;

• 执行器会判断读到的这条记录的 name 是不是 iphone,如果不是则跳过;如果是则将记录发给客户的(是的没错,Server 层每从存储引擎读到一条记录就会发送给客户端,之所以客户端显示的时候是直接显示所有记录的,是因为客户端是等查询语句查询完成后,才会显示出所有的记录)。

• 执行器查询的过程是一个 while 循环,所以还会再查一次,会调用 read_record 函数指针指向的函数,因为优化器选择的访问类型为 all,read_record 函数指针指向的还是 InnoDB 引擎全扫描的接口,所以接着向存储引擎层要求继续读刚才那条记录的下一条记录,存储引擎把下一条记录取出后就将其返回给执行器(Server层),执行器继续判断条件,不符合查询条件即跳过该记录,否则发送到客户端;

• 一直重复上述过程,直到存储引擎把表中的所有记录读完,然后向执行器(Server层) 返回了读取完毕的信息;

• 执行器收到存储引擎报告的查询完毕的信息,退出循环,停止查询。

  • 索引下推

索引下推能够减少二级索引在查询时的回表操作,提高查询的效率,因为它将 Server 层部分负责的事情,交给存储引擎层去处理了。对 age 和 reward 字段建立了联合索引

现在有下面这条查询语句:select * from t_user where age > 20 and reward = 100000;

联合索引当遇到范围查询 (>、<) 就会停止匹配,也就是 age 字段能用到联合索引,但是 reward 字段则无法利用到索引。那么,不使用索引下推(MySQL 5.6 之前的版本)时,执行器与存储引擎的执行流程是这样的:

• Server 层首先调用存储引擎的接口定位到满足查询条件的第一条二级索引记录,也就是定位到 age > 20 的第一条记录;

• 存储引擎根据二级索引的 B+ 树快速定位到这条记录后,获取主键值,然后进行回表操作,将完整的记录返回给 Server 层;

• Server 层在判断该记录的 reward 是否等于 100000,如果成立则将其发送给客户端;否则跳过该记录;

• 接着,继续向存储引擎索要下一条记录,存储引擎在二级索引定位到记录后,获取主键值,然后回表操作,将完整的记录返回给 Server 层;

• 如此往复,直到存储引擎把表中的所有记录读完。可以看到,没有索引下推的时候,每查询到一条二级索引记录,都要进行回表操作,然后将记录返回给 Server,接着 Server 再判断该记录的 reward 是否等于 100000。而使用索引下推后,判断记录的 reward 是否等于 100000 的工作交给了存储引擎层,过程如下 :

• Server 层首先调用存储引擎的接口定位到满足查询条件的第一条二级索引记录,也就是定位到 age > 20 的第一条记录;

• 存储引擎定位到二级索引后,先不执行回表操作,而是先判断一下该索引中包含的列(reward列)的条件(reward 是否等于 100000)是否成立。如果条件不成立,则直接跳过该二级索引。如果成立,则执行回表操作,将完成记录返回给 Server 层。

• Server 层在判断其他的查询条件(本次查询没有其他条件)是否成立,如果成立则将其发送给客户端;否则跳过该记录,然后向存储引擎索要下一条记录。

如此往复,直到存储引擎把表中的所有记录读完。可以看到,使用了索引下推后,虽然 reward 列无法使用到联合索引,但是因为它包含在联合索引(age,reward)里,所以直接在存储引擎过滤出满足 reward = 100000 的记录后,才去执行回表操作获取整个记录。相比于没有使用索引下推,节省了很多回表操作。

总结:

连接器:建立连接,管理连接、校验用户身份;• 查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;• 解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;• 执行 SQL:执行 SQL 共有三个阶段:◦ 预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。◦ 优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;◦ 执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


http://www.hkcw.cn/article/NFEZHsjGjQ.shtml

相关文章

可暂停Windows更新的便捷工具

软件介绍 今天给大家介绍一款能实现Windows暂停更新的实用工具。 吾爱jiedeng按照这个思路开发了一个小工具。该工具能将Windows更新暂停的上限设为7000天&#xff0c;这几乎相当于永久暂停了。 软件使用起来很简单&#xff0c;输入要暂停的天数后&#xff0c;点击【一键修改…

lidar和imu的标定(二)GRIL-Calib

直接看IV. PREPROCESSING这一部分&#xff0c; 首先是提取了地平面。 然后看这个公式&#xff0c;表示地平面和[0,0,1]向量之间构成的旋转矩阵&#xff0c;当然是使用角轴的方式构建的。 B. LiDAR Odometry Utilizing the Ground Plane Residual 使用平面约束的的激光里程计约…

怎么更改cursor chat中的字体大小

使用 ctrl 【Ctrl键和加号键一起按】增加所有窗口的字体大小 然后打开 VS Code 设置并减小文本编辑器字体大小即可

JMeter 直连数据库

1.直连数据库的使用场景 1.1 参数化&#xff0c;例如登录使用的账户名密码都可以从数据库中取得 1.2 断言&#xff0c;查看实际结果和数据库中的预期结果是否一致 1.3 清理垃圾数据&#xff0c;例如插入一个用户&#xff0c;它的ID不能相同&#xff0c;在测试插入功能后将数据删…

【火山引擎 大模型批量推理数据教程---详细讲解一篇过!】

0. 相关的文档 &#xff01;&#xff01;先注册火山引擎账号第一步&#xff01;&#xff01; 批量推理文档网页对象存储网页提交批量处理网页费用接口网页 1. 准备jsonl数据集 官网地址样例&#xff0c;需要根据你自己的数据进行需改 import json## 你的数据&#xff0c;自…

测量3D翼片的距离与角度

1&#xff0c;目的。 测量3D翼片的距离与角度。说明&#xff1a; 标注A 红色框选的区域即为翼片&#xff0c;本示例的3D 对象共有3个翼片待测。L1与L2的距离、L1与L2的角度即为所求的翼片距离与角度。 2&#xff0c;原理。 使用线结构光模型&#xff08;标定模式&#xff0…

单元测试-概述入门

目录 main方法测试缺点&#xff1a; 在pom.xm中&#xff0c;引入junit的依赖。,在test/java目录下&#xff0c;创建测试类&#xff0c;并编写对应的测试方法&#xff0c;并在方法上声明test注解。 练习&#xff1a;验证身份证合法性 测试成功 测试失败 main方法测试缺点&am…

模块联邦:更快的微前端方式!

什么是模块联邦 在前端项目中&#xff0c;不同团队之间的业务模块可能有耦合&#xff0c;比如A团队的页面里有一个富文本模块&#xff08;组件&#xff09;&#xff0c;而B团队 的页面恰好也需要使用这个富文本模块。 传统模式下&#xff0c;B团队只能去抄A团队的代码&#x…

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 时间事件处理部分)

揭秘高效存储模型与数据结构底层实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 时间事件&#xff1a;serverCron函数更新服务器时间缓存更新LRU时钟-lruclock更新服务器每秒执行命令次…

ZIP Cracker版本更新了

废话不多说(也不能多说&#xff0c;原因都懂吧)&#xff0c;上图&#xff0c;阿修大佬已经更新了新的版本 参考原文&#xff1a;https://mp.weixin.qq.com/s/7ptu8tLR_2huivLJdcFBzQ

云南独龙江乡全部通信网络已抢通 紧急抢修保畅通

近日,受持续强降雨影响,怒江傈僳族自治州贡山县独龙江乡遭遇山洪和滑坡等自然灾害,导致通信网络严重受损。5月31日上午10时37分,全乡通信网络站点大面积中断,中国移动云南公司怒江分公司使用卫星传输基站保障独龙江乡政府所在地的通信正常。怒江移动分公司迅速启动防汛应急…

跨越时空的科学对话:现代科学解160年前的遗传学密码 科学家精神熠熠生辉

点滴故事中,领略科学家精神的熠熠光辉。通过讲述一个个科学家的故事,展现他们的风采,记录科技事业的发展历程,弘扬科学家的精神内涵。2025年5月31日是端午节,传统文化中有纪念屈原的习俗。两千三百年前,屈原在汨罗江畔仰观宇宙,以《天问》叩击苍穹:“日月安属?列星安陈…

美国民众开始不愿意花钱了 对现有经济存“潜在焦虑情绪” 多重经济压力交织

近期,一系列数据和调查显示,美国民众对本国经济前景的信心正处于低谷。美国密歇根大学公布的5月消费者信心指数初值降至50.8,连续第五个月下降,为2022年6月以来的最低水平。这种悲观情绪反映出美国经济深层次的矛盾与挑战。通货膨胀一直是困扰美国民众的主要问题。尽管美联…

【GESP真题解析】第 4 集 GESP 三级 2023 年 6 月编程题 1:春游

大家好,我是莫小特。 这篇文章给大家分享 GESP 三级 2023 年 6 月编程题第 1 题:春游。 题目链接 洛谷链接:B3842 春游 一、完成输入 根据输入格式的描述,输入包括两个正整数 N 和 M,N 是 N 位同学,M 是 M 次报出编号,数据范围: 2 ≤ N , M ≤ 1000 2\le N,M \le 10…

遭邻居多次持刀砍门当事人发声 精神疾病患者惹争议

近日,有大连网友在社交平台发布视频称,5月1日和5月28日,疑似患有精神疾病的邻居两次持刀上门,用刀砍其家门,并进行踢踹。网传视频截图显示了这一情况。该网友表示,他们一家才搬来一年,与这名邻居素不相识,没有正面交流过。记者多次尝试联系该网友,但未获回复。6月1日,…

攻防 FART 脱壳:特征检测识别 + 对抗绕过全解析

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ FART 对抗 某视频 app 的壳在启动的时候会检测 FART 特征&#xff0c;日志输出如下&#xff1a; 2025-05-29 02:16:25.612 2557-2557 ActivityThread …

Azure DevOps 管道部署系列之一本地服务器

Azure DevOps 是一个帮助改进 SDLC(软件开发生命周期)的平台。 在本文中,我们将使用 Azure Pipelines 创建自动化部署。 Azure DevOps 团队将 Azure Pipelines 定义为“使用 CI/CD 构建、测试和部署,适用于任何语言、平台和云平台”。 在这里,我将解释如何在 Azure Dev…

冤家路窄!萨巴伦卡谈再战郑钦文:这次我状态正佳期待复仇 罗马失利后渴望翻盘

在法网女单1/8决赛中,头号种子萨巴伦卡直落两盘晋级,接下来将对阵郑钦文。赛后,萨巴伦卡接受了采访。记者问她是否认为与郑钦文的比赛会是一场硬仗,萨巴伦卡表示,每次与郑钦文交手都很艰难,因为对方是一位出色的球员。她期待着一场精彩的较量,并且非常期待在1/4决赛中与…

遭邻居多次持刀砍门当事人发声: 她说我们是脑控组织, 入侵她大脑, 已被送精神鉴定 警方介入处理

近日,辽宁大连有网友发布视频称,疑似患有精神疾病的邻居多次持刀上门砍其家门。5月31日,当事人刘女士向媒体透露,楼下60多岁的邻居自去年10月搬入后,频繁上门滋扰,声称刘女士一家是“脑控组织”,意图入侵她的大脑。刘女士解释说,她们一家是外地人,去年才搬到这里,为了…

涉嫌歧视中国球迷!波多尔斯基向俱乐部作保证 社媒未回应照常更新 否认种族歧视指控

近日,德国名将波多尔斯基被指涉嫌对中国球迷进行种族歧视。据其所在俱乐部的消息,波多尔斯基否认了这一指控,并保证自己没有做出这种行为。昨日,欧冠决赛在德国举行,波多尔斯基到场观看了比赛。赛后,一位中国博主在酒吧外偶遇波多尔斯基并请求合影。博主称,波多尔斯基停…