关于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…...
深入剖析SpringBoot启动机制:run()方法详尽解读
摘要 本文深入解析SpringBoot的启动机制,以run()方法为核心,逐步追踪并详细解释其关键步骤。首先探讨run()方法的工作原理,然后深入代码层面分析各个关键环节。文章提供刷新后钩子和启动后任务的代码示例,帮助读者理解SpringBoot源…...
Nginx中部署多个前端项目
1,准备前端项目 tlias系统的前端资源 外卖项目的前端资源 2,nginx里面的html文件夹中新建,tlias和sky两个文件夹。 切记这是在nginx/html下创建的 mkdir sky mkdir tlias 把tlias和sky的资源都放到对应的文件夹中 3,编辑配置ngi…...
1688寻源通:赋能跨境贸易的高效业务平台
前言 在全球化的浪潮下,跨境电商已成为推动经济发展的重要力量。作为国内领先的B2B电商平台,1688凭借其强大的供应链资源和创新技术,推出了“寻源通”业务,旨在帮助国内供应商和跨境采购商实现更高效、更精准的供需匹配ÿ…...
JVM深入学习(一)
目录 一.JVM概述 1.1 为什么要学jvm? 1.2 jvm的作用 1.3 jvm内部构造 二.JVM类加载 2.1类加载过程 2.2类加载器 2.3类加载器的分类 2.4双亲委派机制 三.运行时数据区 堆空间区域划分(堆) 为什么分区(代)?(…...
Qt Creator 15.0.0如何更换主题和字体
1.打开Qt Creator 15.0.0 (Community), 2.点击编辑栏3.点击Preferences... 4.修改主题,点击环境,修改Theme:栏 5.修改字体大小,点击文本编辑器,修改字号栏。,修改Theme:栏...
“大模型横扫千军”背后的大数据挖掘--浅谈MapReduce
文章目录 O 背景知识1 数据挖掘2 邦费罗尼原则3 TF.IDF4 哈希函数5 分布式文件系统 一、MapReduce基本介绍1. Map 任务2. 按键分组3. Reduce 任务4. 节点失效处理5.小测验:在一个大型语料库上有100个map任务和若干reduce任务: 二、基于MapReduce的基本运…...
shallowRef和shallowReactive的用法以及使用场景和ref和reactive的区别
Vue3 浅层响应式 API 1. ref vs shallowRef 1.1 基本概念 ref: 深层响应式,会递归地将对象的所有属性转换为响应式shallowRef: 浅层响应式,只有 .value 的改变会触发更新,不会递归转换对象的属性 1.2 使用对比 // ref 示例 const deepRe…...
maven、npm、pip、yum官方镜像修改文档
文章目录 Maven阿里云网易华为腾讯云 Npm淘宝腾讯云 pip清华源阿里中科大华科 Yum 由于各博客繁杂,本文旨在记录各常见镜像官网,及其配置文档。常用镜像及配置可评论后加入 Maven 阿里云 官方文档 setting.xml <mirror><id>aliyunmaven&l…...
HTML5+SVG+CSS3实现雪中点亮的圣诞树动画效果源码
源码介绍 这是一款基于HTML5SVGCSS3实现雪中点亮的圣诞树动画效果源码。画面中的圣诞树矗立在雪地中,天上飘落着雪花。当鼠标滑过圣诞树时,可见到圣诞树上的灯光闪烁,同时左下角探出雪怪模样的半个脑袋,四处张望着。整体画面栩栩…...
HTML-新浪新闻-实现标题-样式1
用css进行样式控制 css引入方式: --行内样式:写在标签的style属性中(不推荐) --内嵌样式:写在style标签中(可以写在页面任何位置,但通常约定写在head标签中) --外联样式…...
Linux-day10
第21章 Linux高级篇-日志管理 日志介绍和实例 基本介绍 系统常用的日志 日志服务 日志服务原理图 在这个配置文件里面记录了日志服务程序 日志管理服务rsyslogd -v是反向匹配 invert 日志服务配置文件 时间、主机、是由哪个程序或者服务发生的、事件信息 自定义日志服务 日…...
【Unity3D】《跳舞的线》游戏的方块单方向拉伸实现案例
通过网盘分享的文件:CubeMoveMusic.unitypackage 链接: https://pan.baidu.com/s/1Rq-HH4H9qzVNtpQ84WXyUA?pwda7xn 提取码: a7xn 运行游戏点击空格动态创建拉伸的方块,由Speed控制速度,新方向是随机上下左右生成。 using System.Collect…...
AI智能日志分析系统
文章目录 1.combinations-intelligent-analysis-starter1.目录结构2.pom.xml3.自动配置1.IntelligentAnalysisAutoConfiguration.java2.spring.factories 2.combinations-intelligent-analysis-starter-demo1.目录结构2.pom.xml3.application.yml4.IntelligentAnalysisApplicat…...
试用ChatGPT开发一个大语言模型聊天App
参考官方文档,安装android studio https://developer.android.com/studio/install?hlzh-cn 参考这个添加permission权限: https://blog.csdn.net/qingye_love/article/details/14452863 参考下面链接完成Android Studio 给项目添加 gradle 依赖 ht…...
Unity Epplus读取excel表并存入So文件举例
目录 此篇需要你有一定的阅读代码的能力,不然点开了也不知道在做什么 这是读表工具 So文件这么写 使用 此篇需要你有一定的阅读代码的能力,不然点开了也不知道在做什么 在此之前你需要知道epplus是干什么的,然后知道其基本api࿰…...
连接 OpenAI 模型:基础操作
在这一部分中,我们将介绍如何连接 OpenAI 模型,设置 API 密钥,并使用 Spring AI 的 ChatClient 与 OpenAI 模型进行简单的对话。Spring AI 为集成 OpenAI 模型提供了方便的工具,使得开发者能够更轻松地与 GPT 系列模型进行交互。 …...
[ Spring ] Spring Cloud Alibaba Message Stream Binder for RocketMQ 2025
文章目录 IntroduceProject StructureDeclare Plugins and ModulesApply Plugins and Add DependenciesSender PropertiesSender ApplicationSender ControllerReceiver PropertiesReceiver ApplicationReceiver Message HandlerCongratulationsAutomatically Send Message By …...
ubuntu 更新24LTS中断导致“系统出错且无法恢复,请联系系统管理员”
22LTS to 24LTS 更新过程中手jian把更新程序controlC导致的。 解决 目前企图完成更新来恢复,重启后有软件包冲突,sudo apt upgrade报冲突。无法进行。 将原来source.list重新 sudo dpkg --configure -a sudo apt install -f 这些都不管用。还是显示gno…...
力扣-链表-203 移除链表元素
思路1 处理头节点,然后遍历下一个节点,只有确保下一个节点不是要移除的节点时再跳到下一个节点 代码1 class Solution { public:ListNode* removeElements(ListNode* head, int val) {while(head ! nullptr && head->val val){head head…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
