96SEO 2026-02-23 15:27 22
。

而真正处理数据的过程是发生在内存中的#xff0c;所以需要把磁盘中的数据加载到内存中#xff0c;如果是处理写入或修改请求的话#xff0c;还需要把内…一、InnoDB介绍
InnoDB是一个将表中的数据存储到磁盘上的存储引擎所以即使关机后重启我们的数据还是存在的。
而真正处理数据的过程是发生在内存中的所以需要把磁盘中的数据加载到内存中如果是处理写入或修改请求的话还需要把内存中的内容刷新到磁盘上。
而我们知道读写磁盘的速度非常慢和内存读写差了几个数量级所以当我们想从表中获取某些记录时InnoDB存储引擎需要一条一条的把记录从磁盘上读出来么不那样会慢死InnnoDB采取的方式是将数据分为若干页以页作为磁盘和内存之间交互的基本单位InnoDB中页的大小一般为16KB也就是在一般情况下一次最少从磁盘中读取16KB内容到内存中一次最少把内存中的16KB内容刷新到磁盘中。
我们平时是以记录为单位来向表中插入数据的这些记录在磁盘上的存放方式也被称为行格式或者记录格式。
设计InnoDB的大叔们到现在为止设计了4种不同类型的行格式分别为Compact\Redundant、Dynamic和Compressed行格式随着时间的推移他们可能会设计出更多的行格式但是不管怎么变在原理上都是相同的。
row_format行格式名称比如我们在yuanxiaoxu数据库中创建一个演示用的表record_format_demo可以这样指定它的行格式
)可以看到我们刚刚创建的这个表的行格式就是Compact,另外我们还显式指定了这个表的字符集为ascii。
再向表中插入几条数据现在表中的记录就是这个样子的。
sec)演示表的内容也填充好了现在我们就来看看各个行格式下的存储方式到底有啥不同吧
大家从图中可以看出来一条完整的记录其实可以被分为记录的额外信息和记录真实数据两大部分下边我们详细看一下这两部分的组成。
这部分信息是服务器为了描述这条记录而不得不额外添加的一些信息这些信息分为3类分别是变长字段长度列表、NULL值列表和记录头信息我们分别看一下。
我们知道Mysql支持一些变长的数据类型比如VARCHAR(M)、VARBINARY(M)、各种TEXT类型各种BLOB类型我们也可以把拥有这些数据类型的列称为变长字段变长字段中存储多少字节的数据是不固定的所以我们在存储真实数据的时候需要顺便把这些数据占用的字节数也存起来这样才不至于把Mysql服务器搞懵所以这些变长字段占用的存储空间分为两部分
在Compact行格式中把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位从而形成一个变长字段长度列表各变长字段数据占用的字节数按照列的顺序逆序存放我们再次强调一遍是逆序存放
我们拿record_format_demo表中的第一条记录来举个例子。
因为record_format_demo表的c1、c2、c4列都是varchar(10)类型的也就是变长的数据类型所以这三个列的值长度都需要保存在记录开头处因为record_format_demo表中的各个列都是用的是ascii字符集所以每个字符只需要1个字节来进行编码来看一下第一条记录各变长字段内容的长度
又因为这些长度值需要按照列的逆序存放所以最后变长字段长度列表的字节串用十六进制表示的效果就是各个字节之间实际上没有空格用空格隔开只是方便理解01
把这个字节串组成的变长字段长度列表填入上边的示意图中的效果就是
我们知道表中的某些列可能存储NULL值如果把这些NULL值都放到记录的真实数据中存储会很占地方所以Compact行格式把这些值为NULL的列统一管理起来存储到NULL值列表中他的处理过程是这样的
NULL修饰过的列都是不可以存储NULL值的所以在统计的时候不会把这些列算进去。
如果表中没有允许存储NULL的列则NULL值列表也就不存在了否则将每个允许存储NULL的列对应一个二进制位二进制位按照列的顺序逆序排列二进制位表示的意义如下
除了变长字段长度列表、NULL值列表之外还有一个用于描述记录的记录头信息它是由固定的5各字节组成。
5个字节也就是40个二进制位不同的位代表不同的意思如图
大家不要被这么多的属性和陌生的概念给吓着我这里只是为了内容的完整性把这些位代表的意思都写了出来现在没必要把他们的意思都记住记住也没啥用现在只需要看一遍混个脸熟等之后用到这些属性的时候我们再回过头来看。
对于record_format_demo表来说记录的真实数据除了cq,c2,c3,c4这几个我们自己定义的列的数据以外Mysql会为每个记录默认的添加一些列也称为隐藏列具体的列如下
这里需要提一下InnoDB表对主键生成策略优先使用用户自定义主键作为主键如果用户没有定义主键则选取一个Unique键作为主键如果表中连Unique键都没有定义的话则InnoDB会为表默认添加一个名为riw_id的隐藏列作为主键。
所以我们从上表中可以看出InnoDB会为表默认添加一个名为row_id的隐藏列作为主键。
所以我们从上表中可以看出InnoDB存储会为每条记录都添加transaction_id和roll_pointer这两个列但是row_id是可选的在没有自定义主键以及Unique键的情况下才会添加该列。
这些隐藏列的值不用我们操心InnoDB存储引擎会自己帮我们生成的。
注意第2条记录中c3和c4列的值都为null,他们被存储在了前边的NULL值列表处在记录的真实数据处就不再冗余存储从而节省存储空间。
record_format_demo表的c1,c2,c4列的类型是varchar(10),而c3列的类型是char(10),我们说在compact行格式下只会把变长类型的列的长度逆序存到变长字段长度列表中。
这就意味着对于char(m)类型的列来说当列采用的是定长字符集时该列占用的字节数不会被加到变长字段长度列表而如果采用变长字符集时该列占用的字节数也会被加到变长字段长度列表。
其实知道了Compact行格式之后其他的行格式就是依葫芦画瓢了。
我们现在要介绍的Redundant行格式是Mysql5.0之前用的一种行格式也就是说它已经非常老了但是本着知识完整性的角度还是要提一下大家乐呵乐呵的看就好。
现在我们把表record_format_demo的行格式修改为Redundant:
0为了方便大家理解和节省篇幅我们直接把表record_format_demo在redundant行格式下的两条记录的真实存储数据提供出来之后我们着重分析两种行格式的不同即可。
标记字段长度偏移列表中每个列对应的偏移量是使用1字节还是2字节表示的next_record
上一篇一、SpringBoot核心教程之入门篇-认识SpringBoot
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback