关于MySQL InnoDB存储引擎的一些认识

news2025/2/4 4:46:30

文章目录

  • 一、存储引擎
    • 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语句的过程是怎样的?

在这里插入图片描述

  1. 连接器
  2. 查询缓存(那缓存什么时候失效呢?)
  3. 解析SQL
  4. 执行SQL

语法树

img

1.1 MySQL的存储引擎有哪些?

在这里插入图片描述

  • InnoDB

    • 5.5之后,MySQL默认的存储引擎,支持事务和行级锁,具有回滚和崩溃恢复功能。(为什么InnoDB替代了MyIsam?)
  • MyIsam

    • 不支持事务和行级锁,无法做到崩溃恢复。
    • 数据文件结构有.frm .myd .myi
  • Memory

    • 将数据存储到内存中,可以快速访问数据,并且这些数据不会被修改,重启之后丢失也没问题。

1.2 MyIsam和InnoDB有什么区别?

  • 数据存储方式
    • InnoDB采用索引组织表,索引即数据,数据即索引。
    • MyIsam采用堆表,索引和数据完全分开。
    • MyIsam仅支持表锁,InnoDB支持表锁和行锁。
  • 事务
    • MyIsam不支持事务。

堆表

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

索引组织表
在这里插入图片描述

  1. 索引组织表中是有聚簇索引和非聚簇索引的。
  2. 非聚簇索引的变动不影响聚簇索引。

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.脏页更新时机
  1. 当redo log日志满了的情况下,会主动触发脏页刷新到磁盘;
  2. Buffer Pool空间不足时,需要将一部分数据页淘汰掉,如果淘汰的是脏页,就先将脏页同步到磁盘;
  3. 空闲时,后台线程定期将适量的脏页刷入到磁盘;
  4. 关闭前,把所有脏页刷入到磁盘。
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.约束?

  1. 主键约束:唯一标识一条记录,不能重复也不能为空,一般会给id设置为主键。
  2. 唯一约束:保证字段在表中的数值是唯一的。
  3. 非null约束:保证字段不能为null。
  4. 外键约束:确保表与表之间的引用完整性。
  5. 默认约束:插入数据时,给没有取值的字段设置默认值。

2.三范式?

  1. 第一范式:所有字段都是基本项。
  2. 第二范式:解决部分依赖关系。
  3. 第三范式:不允许存在传递依赖。

比如,一个订单表:

ID姓名单价数量总计
1小明205100
2李华30130
3张三10220

非主键字段,完全依赖于主键订单编号,符合第二范式。但是总计字段不是完全依赖主键字段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

在这里插入图片描述

在这里插入图片描述

最后,也是提前祝每一位还在努力提升技术的小伙伴新年快乐,身体健康。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2291606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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中打开一个工作区后…

π0:仅有3B数据模型打通Franka等7种机器人形态适配,实现0样本的完全由模型自主控制方法

Chelsea Finn引领的Physical Intelligence公司,专注于打造先进的机器人大模型,近日迎来了一个令人振奋的里程碑。在短短不到一年的时间内,该公司成功推出了他们的首个演示版本。这一成就不仅展示了团队的卓越技术实力,也预示着机器…

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)) # 默…

向上调整算法(详解)c++

算法流程: 与⽗结点的权值作⽐较,如果⽐它⼤,就与⽗亲交换; 交换完之后,重复 1 操作,直到⽐⽗亲⼩,或者换到根节点的位置 这里为什么插入85完后合法? 我们插入一个85,…

LabVIEW无线齿轮监测系统

本案例介绍了基于LabVIEW的无线齿轮监测系统设计。该系统利用LabVIEW编程语言和改进的天牛须算法优化支持向量机,实现了无线齿轮故障监测。通过LabVIEW软件和相关硬件,可以实现对齿轮箱振动信号的采集、传输和故障识别,集远程采集、数据库存储…

力扣第435场周赛讲解

文章目录 题目总览题目详解3442.奇偶频次间的最大差值I3443.K次修改后的最大曼哈顿距离3444. 使数组包含目标值倍数的最少增量3445.奇偶频次间的最大差值 题目总览 奇偶频次间的最大差值I K次修改后的最大曼哈顿距离 使数组包含目标值倍数的最少增量 奇偶频次间的最大差值II …

内存四区

一、内存四区模型 1. 操作系统把物理硬盘代码load到内存 2. 操作系统把c代码分成四个区 3. 操作系统遭到main函数入口执行 二、内存四区 1. 栈区(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值。其操作方式类似…

大模型综合性能考题汇总

- K1.5长思考版本 一、创意写作能力 题目1:老爸笑话 要求:写五个原创的老爸笑话。 考察点:考察模型的幽默感和创意能力,以及对“原创”要求的理解和执行能力。 题目2:创意故事 要求:写一篇关于亚伯拉罕…

租赁管理系统在促进智能物业运营中的关键作用和优化策略分析

租赁管理系统在智能物业运营中的关键作用与优化策略 随着科技的飞速发展,租赁管理系统在智能物业运营中扮演着越来越重要的角色。这种系统不仅提高了物业管理的效率,更是促进了资源的优化配置和客户关系的加强。对于工业园、产业园、物流园、写字楼和公…

【论文复现】基于Otsu方法的多阈值图像分割改进鲸鱼优化算法

目录 1.摘要2.鲸鱼优化算法WOA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 本文提出了一种基于Otsu方法的多阈值图像分割改进鲸鱼优化算法(RAV-WOA)。RAV-WOA算法能够在分割灰度图像和彩色图像时,自动选择最优阈值,并确…

关于系统重构实践的一些思考与总结

文章目录 一、前言二、系统重构的范式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提示, 为重叠实体设计个性化的提示,为非重叠实体设计共…

【Rust自学】16.3. 共享状态的并发

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 16.3.1. 使用共享来实现并发 还记得Go语言有一句名言是这么说的:Do not communicate by sharing memory; instead, share me…

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 子网掩码 . . . . . . . .…

2025-工具集合整理

科技趋势 github-rank 🕷️Github China/Global User Ranking, Global Warehouse Star Ranking (Github Action is automatically updated daily). 科技爱好者周刊 制图工具 D2 D2 A modern diagram scripting language that turns text to diagrams 文档帮助 …

Alibaba开发规范_编程规约之集合框架:最佳实践与常见陷阱

文章目录 引言1. hashCode与equals方法的覆写1.1 规则1.2 解释1.3 代码示例正例反例 2. ArrayList的subList方法2.1 规则2.2 解释2.3 代码示例正例反例 3. Map的keySet、values和entrySet方法3.1 规则3.2 解释3.3 代码示例正例反例 4. Collections类返回的不可变集合4.1 规则4.…

小红的小球染色期望

B-小红的小球染色_牛客周赛 Round 79 题目描述 本题与《F.R小红的小球染色期望》共享题目背景,但是所求内容与范围均不同,我们建议您重新阅读题面。 有 n 个白色小球排成一排。小红每次将随机选择两个相邻的白色小球,将它们染成红色。小红…