关于MySQL InnoDB存储引擎的一些认识
文章目录
- 一、存储引擎
- 1.MySQL中执行一条SQL语句的过程是怎样的?
- 1.1 MySQL的存储引擎有哪些?
- 1.2 MyIsam和InnoDB有什么区别?
- 2.MySQL表的结构是什么?
- 2.1 行结构是什么样呢?
- 2.1.1 NULL列表?
- 2.1.2 char和varchar?
- 3.MySQL 缓存
- 3.1 聚簇索引和非聚簇索引
- 3.2 Buffer Pool
- 3.2.1 什么是Buffer Pool?
- 3.2.2 空闲页?
- 3.2.3 脏页?
- 3.2.4 缓存命中率咋样?脏页更新到磁盘时机呢?
- 1.预读失效
- 2.Buffer Pool污染
- 3.脏页更新时机
- 3.2.5 Buffer Pool可以代替Redis吗?
- 二、SQL基础
- 前言
- 1.约束?
- 2.三范式?
- 3.SQL刷题网站
- 参考资料
- 关于我的网站
一、存储引擎
1.MySQL中执行一条SQL语句的过程是怎样的?

- 连接器
- 查询缓存(那缓存什么时候失效呢?)
- 解析SQL
- 执行SQL
语法树
1.1 MySQL的存储引擎有哪些?

-
InnoDB
- 5.5之后,MySQL默认的存储引擎,支持事务和行级锁,具有回滚和崩溃恢复功能。(为什么InnoDB替代了MyIsam?)
-
MyIsam
- 不支持事务和行级锁,无法做到崩溃恢复。
- 数据文件结构有.frm .myd .myi
-
Memory
- 将数据存储到内存中,可以快速访问数据,并且这些数据不会被修改,重启之后丢失也没问题。
1.2 MyIsam和InnoDB有什么区别?
- 数据存储方式
- InnoDB采用索引组织表,索引即数据,数据即索引。
- MyIsam采用堆表,索引和数据完全分开。
- 锁
- MyIsam仅支持表锁,InnoDB支持表锁和行锁。
- 事务
- MyIsam不支持事务。
堆表

- 堆表中的索引都是非聚簇索引,没有聚簇索引这一说。
- 由于索引的叶子节点存放的是堆表的物理地址,如果堆表的数据发生变动,那么索引将全部被动更新,这是非常影响性能的。
索引组织表

- 索引组织表中是有聚簇索引和非聚簇索引的。
- 非聚簇索引的变动不影响聚簇索引。
2.MySQL表的结构是什么?
MySQL默认的是InnoDB存储引擎,所以相关内容主要以InnoDB为主。

- 段:用于存储具体对象,比如数据段、索引段、Undo段,新增数据时,会分配新的区。
- 区:每个区是1mb,包含64页。
- 页:是数据存储的基本单位,每页16kb,又根据不同的数据类型分为不同类型的页,比如数据页、索引页、undo页、系统页、事务页。
- 行:行数据。
2.1 行结构是什么样呢?

- 变长字符长度列表:只出现在有变长字段的表记录中,主要是根据这个变长字段去读取对应长度的数据。(varchar和char的区别?)
- NULL值列表:NULL是怎么存储的?
- 头信息
- delete_mask:表示这条数据是否删除,执行DELETE的时候不是真的删除,而是标记delete_mask=1 。
- next_record:下一条记录的位置。
- record_type:表示记录类型,0 普通记录,1 非叶子节点,2 最小记录,3 最大记录。
- row_id:不是必须的,如果没有主键或唯一约束,就使用这个隐藏列。
- trx_id:事务id,表示是由那个事务生成的。6byte
- roll_ptr:记录上一个版本的指针。
2.1.1 NULL列表?
NULL值列表的大小是在插入行数据时根据每行数据中允许为NULL的列数量动态生成的。

- 列1:不是NULL值,用0表示。
- 列2:是NULL值,用1表示。
一个字节最多可以表示8个列,也就是说可以为null字段的列,最少只需要1byte表示即可,这样就大大节省空间了。
2.1.2 char和varchar?
char是固定长度的字符串类型,在系统中占用固定存储空间,如果实际存储空间比较小用空格填充。
varchar可变长,需要1-2字节存储可变长字符串的长度,不会进行空格填充。
3.MySQL 缓存
3.1 聚簇索引和非聚簇索引


聚簇索引和非聚簇索引最主要的区别就是B+树叶子节点存放的内容不同:
- 聚簇索引的B+树的叶子节点存放的是主键值和完整的记录;
- 非聚簇索引的B+树叶子节点存放的是索引值和主键值。
如果查询条件用到了二级索引,但是查询的数据不是主键值,也不是二级索引值,这时在二级索引找到主键值后,就需要回表才能查找到数据,需要扫描两次B+树。
如果查询的是主键值,因为在二级索引就能查询到,那时候就会用到覆盖索引,不需要回表,只需要扫描一次B+树。
3.2 Buffer Pool
3.2.1 什么是Buffer Pool?
Buffer Pool就是MySQL为了提高查询性能的一个缓冲池,位于存储引擎层。默认innodb_buffer_pool_size=128MB。
InnoDB会为Buffer Pool申请一片连续的内存空间,然后按照默认的16kb的大小划分出一个个页,Buffer Pool中的页叫做缓存页。

为了管理这些缓存页,InnoDB为每一个缓存都创建了一个控制块,这些控制块包括【缓存页的表空间、页号、缓存页地址、链表节点】等。
3.2.2 空闲页?
Buffer Pool是一片连续的内存空间,但是在MySQL运行一段时间后,肯定有空闲的也有被使用的。那么这些空闲页怎么办?
我们下次读取磁盘数据的时候,是要遍历Buffer Pool找到一个空闲页吗?那也太浪费的吧。所以就为这些空闲页创建一个Free链表。
那么每当需要加载数据的时候,直接在Free链表拿一个就行。
3.2.3 脏页?
如果说我的缓存页被修改了,那么就直接更新我的磁盘吗?那也太拉低性能了吧。所以就设计了脏页,由后台线程去更新到磁盘好了。
那么怎么找这个脏页呢?那就创建一个链表吧,就叫Flush链表。
3.2.4 缓存命中率咋样?脏页更新到磁盘时机呢?
对于这个Buffer Pool来讲,我们当然希望访问次数多的一直留下,访问次数少的就给他移除。
那么就使用LRU算法,来实现这个功能,具体LRU是什么呢,可以看这篇文章。
https://blog.csdn.net/m0_73337964/article/details/144726361?spm=1001.2014.3001.5501
如果直接使用LRU算法的话,会出现两种问题预读失效和Buffer Pool污染。
1.预读失效
预读失效就是MySQL在访问数据时,会顺带给邻居也读出来,但是这些被提前读出来的邻居,并没有被访问,相当于这个预读白做了,这就是预读失效。
要避免预读失效带来的影响,最好就是让预读的页停留在Buffer Pool里的时间尽可能短,让真正被访问的页移动到LRU链表头部,从而保证真正的热数据留在Buffer Pool里的时间尽可能长。
MySQL将LRU链表分为了两个部分young和old区域。

预读的页加载到old区域头部,当页真正被访问时,才将其加入到young区域头部。
2.Buffer Pool污染
当某一个SQL语句,在Buffer Pool比较有限的情况下,可能会将Buffer Pool里的所有页都替换出去,导致大量热数据被淘汰了,等这些热数据又被再次访问的时候,由于缓存未命中,就会产生大量的IO,这就是Buffer Pool污染。
MySQL的解决方案是,进入到young区域条件增加了一个停留在old区域的时间判断。
- 如果后续的访问时间与第一次访问的时间在某个时间间隔内,那么该缓存页就不会被从old区域移动到young区域的头部。
- 如果后续的访问时间与第一次访问的时间不再某个时间间隔内,那么该缓存页移动到young区域的头部。
间隔时间默认为innodb_old_blocks_time=1000ms,也就是说只有同时满足被访问与在old区域停留时间超过1秒两个条件,才会被插入到young区域头部。
3.脏页更新时机
- 当redo log日志满了的情况下,会主动触发脏页刷新到磁盘;
- Buffer Pool空间不足时,需要将一部分数据页淘汰掉,如果淘汰的是脏页,就先将脏页同步到磁盘;
- 空闲时,后台线程定期将适量的脏页刷入到磁盘;
- 关闭前,把所有脏页刷入到磁盘。
3.2.5 Buffer Pool可以代替Redis吗?
我觉得不能代替。
因为MySQL的设计是进行持久化存储数据,所有的模块设计主要关系到磁盘的IO性能,在内存缓存方面并不是很迫切,而Redis是存储在内存的数据库,在内存层面操作具有每秒数十万次访问的高性能,Redis 注重极致的内存操作效率,而 MySQL 更关注数据的持久化和复杂查询能力,所以不能代替。
二、SQL基础
前言
重点掌握AND、OR、IN、NOT IN、BETWEEN、LIKE、IS、NULL、EXISTS、DISTINCT。
JOIN:内连接、左连接、外连接。UNION:组合查询。
INSERT、DELETE、UPDATE。
聚合函数:COUNT、MAX、MIN、SUM、AVG。
重点掌握GROUP BY和HAVING以及与Where的区别。
count(*)=count(1)>count(primary key field)>count(field)
1.约束?
- 主键约束:唯一标识一条记录,不能重复也不能为空,一般会给id设置为主键。
- 唯一约束:保证字段在表中的数值是唯一的。
- 非null约束:保证字段不能为null。
- 外键约束:确保表与表之间的引用完整性。
- 默认约束:插入数据时,给没有取值的字段设置默认值。
2.三范式?
- 第一范式:所有字段都是基本项。
- 第二范式:解决部分依赖关系。
- 第三范式:不允许存在传递依赖。
比如,一个订单表:
| ID | 姓名 | 单价 | 数量 | 总计 |
|---|---|---|---|---|
| 1 | 小明 | 20 | 5 | 100 |
| 2 | 李华 | 30 | 1 | 30 |
| 3 | 张三 | 10 | 2 | 20 |
非主键字段,完全依赖于主键订单编号,符合第二范式。但是总计字段不是完全依赖主键字段ID,可以由单价数量得到,所以不符合第三范式。
数据库三范式主要是为了解决数据冗余、数据插入更新不一致性问题。
但是,如果范式化的将数据分解为多个表,那么查询数据的时候,可能需要多表关联的操作,那么成本是很高的,所以有时业务场景采用字段冗余设计表,避免联表查询。
3.SQL刷题网站
https://www.nowcoder.com/exam/oj?page=1&tab=SQL%E7%AF%87&topicId=199
参考资料
1、https://xiaolincoding.com/mysql/base/how_select.html#%E9%A2%84%E5%A4%84%E7%90%86%E5%99%A8
2、https://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/MySQL%E5%AE%9E%E6%88%98%E5%AE%9D%E5%85%B8/09%20%20%E7%B4%A2%E5%BC%95%E7%BB%84%E7%BB%87%E8%A1%A8%EF%BC%9A%E4%B8%87%E7%89%A9%E7%9A%86%E7%B4%A2%E5%BC%95.md
3、https://xiaolincoding.com/mysql/base/row_format.html#%E8%A1%A8%E7%A9%BA%E9%97%B4%E6%96%87%E4%BB%B6%E7%9A%84%E7%BB%93%E6%9E%84%E6%98%AF%E6%80%8E%E4%B9%88%E6%A0%B7%E7%9A%84
关于我的网站
最后,关于我自己的网站GolangCode也是正式上线了。哈哈,也是简单的搭建了一个vuepress-theme-hope主题的静态网站,主要分享一些Go、MySQL、Redis等的后端开发编程笔记。如果有帮助的话,可以给我点点star。🍻🍻🍻
网站链接:golangcode.cn


最后,也是提前祝每一位还在努力提升技术的小伙伴新年快乐,身体健康。
相关文章:
关于MySQL InnoDB存储引擎的一些认识
文章目录 一、存储引擎1.MySQL中执行一条SQL语句的过程是怎样的?1.1 MySQL的存储引擎有哪些?1.2 MyIsam和InnoDB有什么区别? 2.MySQL表的结构是什么?2.1 行结构是什么样呢?2.1.1 NULL列表?2.1.2 char和varc…...
WSL2中安装的ubuntu开启与关闭探讨
1. PC开机后,查询wsl状态 在cmd或者powersell中输入 wsl -l -vNAME STATE VERSION * Ubuntu Stopped 22. 从windows访问WSL2 wsl -l -vNAME STATE VERSION * Ubuntu Stopped 23. 在ubuntu中打开一个工作区后…...
LeetCode435周赛T2贪心
题目描述 给你一个由字符 N、S、E 和 W 组成的字符串 s,其中 s[i] 表示在无限网格中的移动操作: N:向北移动 1 个单位。S:向南移动 1 个单位。E:向东移动 1 个单位。W:向西移动 1 个单位。 初始时&#…...
π0:仅有3B数据模型打通Franka等7种机器人形态适配,实现0样本的完全由模型自主控制方法
Chelsea Finn引领的Physical Intelligence公司,专注于打造先进的机器人大模型,近日迎来了一个令人振奋的里程碑。在短短不到一年的时间内,该公司成功推出了他们的首个演示版本。这一成就不仅展示了团队的卓越技术实力,也预示着机器…...
DeepSeek-R1 低成本训练的根本原因是?
在人工智能领域,大语言模型(LLM)正以前所未有的速度发展,驱动着自然语言处理、内容生成、智能客服等众多应用的革新。然而,高性能的背后往往是高昂的训练成本,动辄数百万美元的投入让许多企业和研究机构望而…...
pandas(二)读取数据
一、读取数据 示例代码 import pandaspeople pandas.read_excel(../002/People.xlsx) #读取People数据 print(people.shape) # 打印people表的行数、列数 print(people.head(3)) # 默认打印前5行,当前打印前3行 print("") print(people.tail(3)) # 默…...
北京门头沟区房屋轮廓shp的arcgis数据建筑物轮廓无偏移坐标测评
在IT行业中,地理信息系统(GIS)是用于处理、分析和展示地理空间数据的重要工具,而ArcGIS则是GIS领域中的一款知名软件。本文将详细解析标题和描述中提及的知识点,并结合“门头沟区建筑物数据”这一标签,深入…...
【自学笔记】Java的重点知识点-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Java知识点概览一、Java简介二、Java基本语法三、面向对象编程(OOP)四、异常处理五、常用类库六、多线程编程七、网络编程 注意事项 总结 Ja…...
向上调整算法(详解)c++
算法流程: 与⽗结点的权值作⽐较,如果⽐它⼤,就与⽗亲交换; 交换完之后,重复 1 操作,直到⽐⽗亲⼩,或者换到根节点的位置 这里为什么插入85完后合法? 我们插入一个85,…...
LabVIEW无线齿轮监测系统
本案例介绍了基于LabVIEW的无线齿轮监测系统设计。该系统利用LabVIEW编程语言和改进的天牛须算法优化支持向量机,实现了无线齿轮故障监测。通过LabVIEW软件和相关硬件,可以实现对齿轮箱振动信号的采集、传输和故障识别,集远程采集、数据库存储…...
用deepseek解决python问题——在cmd终端运行python指令弹出应用商店,检查路径已经加入环境变量
首先上结论:可行性非常强 当然我没有广泛对比,至少豆包解决方案基本上就是网络上能搜到的一些方法,没有帮我解决,下面直接看一下对话吧 我:在cmd运行python指令弹出应用商店,检查路径已经加入环境变量 D…...
力扣第435场周赛讲解
文章目录 题目总览题目详解3442.奇偶频次间的最大差值I3443.K次修改后的最大曼哈顿距离3444. 使数组包含目标值倍数的最少增量3445.奇偶频次间的最大差值 题目总览 奇偶频次间的最大差值I K次修改后的最大曼哈顿距离 使数组包含目标值倍数的最少增量 奇偶频次间的最大差值II …...
内存四区
一、内存四区模型 1. 操作系统把物理硬盘代码load到内存 2. 操作系统把c代码分成四个区 3. 操作系统遭到main函数入口执行 二、内存四区 1. 栈区(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值。其操作方式类似…...
大模型综合性能考题汇总
- K1.5长思考版本 一、创意写作能力 题目1:老爸笑话 要求:写五个原创的老爸笑话。 考察点:考察模型的幽默感和创意能力,以及对“原创”要求的理解和执行能力。 题目2:创意故事 要求:写一篇关于亚伯拉罕…...
Python - pyautogui库 模拟鼠标和键盘执行GUI任务
安装库: pip install pyautogui 导入库:import pyautogui 获取屏幕尺寸: s_width, s_height pyautogui.size() 获取鼠标当前位置: x, y pyautogui.position() 移动鼠标到指定位置(可以先使用用上一个函数调试获取当…...
c++ list的front和pop_front的概念和使用案例—第2版
在 C 标准库中,std::list 的 front() 和 pop_front() 是与链表头部元素密切相关的两个成员函数。以下是它们的核心概念和具体使用案例: 1. front() 方法 概念: 功能:返回链表中第一个元素的引用(直接访问头部元素&am…...
租赁管理系统在促进智能物业运营中的关键作用和优化策略分析
租赁管理系统在智能物业运营中的关键作用与优化策略 随着科技的飞速发展,租赁管理系统在智能物业运营中扮演着越来越重要的角色。这种系统不仅提高了物业管理的效率,更是促进了资源的优化配置和客户关系的加强。对于工业园、产业园、物流园、写字楼和公…...
【论文复现】基于Otsu方法的多阈值图像分割改进鲸鱼优化算法
目录 1.摘要2.鲸鱼优化算法WOA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 本文提出了一种基于Otsu方法的多阈值图像分割改进鲸鱼优化算法(RAV-WOA)。RAV-WOA算法能够在分割灰度图像和彩色图像时,自动选择最优阈值,并确…...
TypeScript 运算符
TypeScript 运算符 TypeScript 作为 JavaScript 的超集,在 JavaScript 的基础上增加了静态类型系统,使得开发大型应用更加容易和维护。在 TypeScript 中,运算符是执行特定数学或逻辑运算的符号。本文将详细介绍 TypeScript 中常见的运算符,并对其使用方法进行详细阐述。 …...
关于系统重构实践的一些思考与总结
文章目录 一、前言二、系统重构的范式1.明确目标和背景2.兼容屏蔽对上层的影响3.设计灰度迁移方案3.1 灰度策略3.2 灰度过程设计3.2.1 case1 业务逻辑变更3.2.2 case2 底层数据变更(数据平滑迁移)3.2.3 case3 在途新旧流程兼容3.2.4 case4 接口变更3.2.5…...
电介质超表面中指定涡旋的非线性生成
涡旋光束在众多领域具有重要应用,但传统光学器件产生涡旋光束的方式限制了其在集成系统中的应用。超表面的出现为涡旋光束的产生带来了新的可能性,尤其是在非线性领域,尽管近些年来已经有一些研究,但仍存在诸多问题,如…...
学习日记-250202
现在开始要继续写我的日记了......(也可以当作笔记吧) 一.论文 Prompt Transfer for Dual-Aspect Cross Domain Cognitive Diagnosis 主要内容: 主要是加入prompt提示, 为重叠实体设计个性化的提示,为非重叠实体设计共…...
pytorch实现简单的情感分析算法
人工智能例子汇总:AI常见的算法和例子-CSDN博客 在PyTorch中实现中文情感分析算法通常涉及以下几个步骤:数据预处理、模型定义、训练和评估。下面是一个简单的实现示例,使用LSTM模型进行中文情感分析。 1. 数据预处理 首先,我…...
【Rust自学】16.3. 共享状态的并发
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 16.3.1. 使用共享来实现并发 还记得Go语言有一句名言是这么说的:Do not communicate by sharing memory; instead, share me…...
git 新项目
新项目git 新建的项目如何进行git 配置git git config --global user.name "cc" git config --global user.email ccexample.com配置远程仓库路径 // 添加 git remote add origin http://gogs/cc/mc.git //如果配错了,删除 git remote remove origin初…...
【LeetCode 刷题】回溯算法-子集问题
此博客为《代码随想录》二叉树章节的学习笔记,主要内容为回溯算法子集问题相关的题目解析。 文章目录 78.子集90.子集II 78.子集 题目链接 class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:res, path [], []def dfs(start: int) ->…...
LLMs之DeepSeek:Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略
LLMs之DeepSeek:Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略 目录 Math-To-Manim的简介 1、特点 2、一个空间推理测试—考察不同大型语言模型如何解释和可视化空间关系 3、DeepSeek R1-Zero的简介:处理更…...
2025年2月2日(网络编程 tcp)
tcp 循环服务 import socketdef main():# 创建 socket# 绑定tcp_server socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server.bind(("", 8080))# socket 转变为被动tcp_server.listen(128)while True:# 产生专门为链接进来的客户端服务的 socketprint(&qu…...
WSL2中安装的ubuntu搭建tftp服务器uboot通过tftp下载
Windows中安装wsl2,wsl2里安装ubuntu。 1. Wsl启动后 1)Windows下ip ipconfig 以太网适配器 vEthernet (WSL (Hyper-V firewall)): 连接特定的 DNS 后缀 . . . . . . . : IPv4 地址 . . . . . . . . . . . . : 172.19.32.1 子网掩码 . . . . . . . .…...
C#从XmlDocument提取完整字符串
方法1:通过XmlDocument的OuterXml属性,见XmlDocument类 该方法获得的xml字符串是不带格式的,可读性差 方法2:利用XmlWriterSettings控制格式等一系列参数,见XmlWriterSettings类 例子: using System.IO; …...
