当前位置: 首页> 财经> 产业 > 简述网站内容如何优化_小米软件开发工程师待遇_手机优化大师官方版_网站开发用什么语言

简述网站内容如何优化_小米软件开发工程师待遇_手机优化大师官方版_网站开发用什么语言

时间:2025/7/10 14:45:33来源:https://blog.csdn.net/sxwwudi/article/details/147293999 浏览次数:0次
简述网站内容如何优化_小米软件开发工程师待遇_手机优化大师官方版_网站开发用什么语言

目录

一、InnoDB

1:基本单位 - 页

2:行格式

2.1:记录的格外信息

2.2:记录的真实记录

3:行溢出


一、InnoDB

1:基本单位 - 页

上一篇文章的图像中有描述:存储引擎会操作MySQL服务器上的文件系统(通俗一点就是磁盘中的文件夹内的文件)。而InnoDB正是一个将表中的数据存储到磁盘上的存储引擎,所以即使我们关闭了MySQL服务器,只要我们愿意重启,那数据还是会存在的(对比Memory)。

补充:计算机近乎(不一定是所有哈)所有的数据计算都是在内存中进行的

而刚刚我们知道,存储引擎和文件系统交互时,需要先将磁盘中的数据加载到内存中,如果是处理写入修改等请求的话,那可能还需要把内存中的数据刷新(如果 刷新 不好听,你理解为 写出 也可以)到磁盘中。

而我们又知道,磁盘读写是非常慢的,此时如果是一条一条地读取数据到内存,那时间成本会相当高,所以InnoDB采取的策略是通过 “页” 来与文件系统交互

总结的来说:InnoDB将数据划分为若干页,以页为单位让数据在磁盘和内存之间进行交互,InnoDB中页的大小一般为16KB

2:行格式

行格式:就是我们存储在表中的一行数据的指定格式

行格式目前定义了四种:compact、redundant、dynamic和compressed

Compact主要由两部分组成:记录的额外信息 和 记录的真实数据

在这里插入图片描述

额外信息是给真实数据服务的,额外信息又由三部分组成:变长字段长度列表、NULL值列表以及记录头信息

数据举例(下面图片都是以这个数据为主):

在这里插入图片描述

2.1:记录的格外信息

变长长度列表:逆序存储真实数据中变长字段所用的字节长度(空值不放里面)

在这里插入图片描述

NULL值列表:按列逆序二进制方式存储值为NULL的数据(非空不放里面、没有空值的时候这个列表不会存在)

110 二进制对应 6

在这里插入图片描述

记录头信息:5个字节40个二进制位(看看得了)

在这里插入图片描述

在这里插入图片描述

2.2:记录的真实记录

真实记录中,除了真正被记录的,还会存在一些隐藏列(DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR)

在这里插入图片描述

InnoDB回味每条记录添加 transaction_id 和 roll_pointer 两列,而对于 row_id 则会进行判断(如果没有主键或者唯一键时,就会自动生成)

char(M)和varchar(M)中,两个M都为字符数

提醒:除了MySQL中数据类型有变长的varchar,在字符集中,也存在变长的,比如utf8中常见的汉字占用2字节,但如果是生僻字,则会占用3个字节

char(M)如果采用的是定长字符集(如果ascii,一个字符只会占用一个字节),那么被char(M)数据类型限制的列,它的长度不会被记录在变长列表中;

但如果采用的是变长字符集(如果utf8,一个字符可能占用2~3个字节),那么被char(M)数据类型限制的列,它的长度会被记录在变长列表中。

再次提醒:变长列表存储的是字节长度(逆序),不是字符长度。

Redundant 行格式,MySQL5.0之前用,现在很少

Dynamic 行格式(类似compact),MySQL5.7默认

Compressed 行格式(类似compact),会采用压缩算法对页进行压缩,节省空间

3:行溢出

varchar(M) 最多存储 65535 个字节,M是字符数

如果采用 ascii (最多1位) 存储 varchar(65535)

create table varchar_size_demo(v varchar(65535)
) charset=ascii row_format=Compact;
# 出现报错说长度不够,建议用TEXT或者BLOB
# Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

这是因为65535指的是 真实数据 + 真实数据占用字节的长度 + NULL值标识(当然,如果设置了 not null 就没有这个)

于是,ascii 可以创建的是 varchar(65532),其中2个被真实数据占用长度拿走,1个被NULL值标识拿走。

当允许为NULL值的情况下(且整表只有1个字段的时候)其它字符集:

utf8(最多3位) - 21844 (65532 / 3) 个字符

gbk(最多2位) - 32766 (65532 / 2) 个字符

补充:一行中,所有列(不包含隐藏列和记录头信息)占用的字节长度加起来不能超过 65535 个字节

行溢出:InnoDB与文件系统交互的基本单位是 页 ,而一页是16KB,当记录太多数据时,当前页放不下,就会把多余的数据放在其他页中的现象

对于 Compact 和 Reduntant 行格式来说,如果某一列中的数据非常多的话,在本记录的真实数据处只会存储该列的前 768 个字节的数据和一个指向其他页的地址,然后把剩下的数据存放到其他页中,这个过程也叫做 行溢出,存储超出 768 字节的那些页面也被称为 溢出页

对于 Dynamic和Compressed 行格式来说,处理行溢出数据时有点特殊,它们不会在记录的真实数据处存储字符串的前768个字节,而是把所有的字节都存储到其他页面中,只在记录的真实数据处存储其他页面的地址。

Dynamic和Compressed 行格式来说,处理行溢出数据时有点特殊,它们不会在记录的真实数据处存储字符串的前768个字节,而是把所有的字节都存储到其他页面中,只在记录的真实数据处存储其他页面的地址。

在这里插入图片描述

关键字:简述网站内容如何优化_小米软件开发工程师待遇_手机优化大师官方版_网站开发用什么语言

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: