个人做网站语言,书怎么做pdf下载网站,模具厂咋做网站,网站单页制作我们知道 Compact 行格式在 CHAR(M) 类型的列中存储数据的时候还挺麻烦#xff0c;分变长字符集和定长字符集的情况#xff0c;而在 Redundant 行格式中十分干脆#xff0c;不管该列使用的字符集是啥#xff0c;只要是使用 CHAR(M) 类型#xff0c;占用的真实数据空间就是…我们知道 Compact 行格式在 CHAR(M) 类型的列中存储数据的时候还挺麻烦分变长字符集和定长字符集的情况而在 Redundant 行格式中十分干脆不管该列使用的字符集是啥只要是使用 CHAR(M) 类型占用的真实数据空间就是该字符集表示一个字符最多需要的字节数和 M 的乘积。比方说使用 utf8 字符集的 CHAR(10) 类型的列占用的真实数据空间始终为 30 个字节使用 gbk 字符集的 CHAR(10) 类型的列占用的真实数据空间始终为 20 个字节。由此可以看出来使用 Redundant 行格式的 CHAR(M) 类型的列是不会产生碎片的。
4.3.4 行溢出数据
4.3.4.1 VARCHAR(M)最多能存储的数据
我们知道对于 VARCHAR(M) 类型的列最多可以占用 65535 个字节。其中的 M 代表该类型最多存储的字符数量如果我们使用 ascii 字符集的话一个字符就代表一个字节我们看看 VARCHAR(65535) 是否可用 从报错信息里可以看出 MySQL 对一条记录占用的最大存储空间是有限制的除了 BLOB 或者 TEXT 类型的列之外其他所有的列不包括隐藏列和记录头信息占用的字节长度加起来不能超过 65535 个字节。所以 MySQL 服务器建议我们把存储类型改为 TEXT 或者 BLOB 的类型。这个 65535 个字节除了列本身的数据之外还包括一些其他的数据 storage overhead 比如说我们为了存储一个 VARCHAR(M) 类型的列其实需要占用3部分存储空间
真实数据
真实数据占用字节的长度
NULL 值标识如果该列有 NOT NULL 属性则可以没有这部分存储空间 如果 VARCHAR 类型的列有 NOT NULL 属性那最多只能存储 65533 个字节的数据因为真实数据的长度可能占用2个字节不需要 NULL 值标识 4.3.4.2 记录中的数据太多产生的溢出
我们以 ascii 字符集下的 varchar_size_demo 表为例插入一条记录 其中的 REPEAT(a, 65532) 是一个函数调用它表示生成一个把字符 a 重复 65532 次的字符串。前边说过 MySQL 中磁盘和内存交互的基本单位是 页 也就是说 MySQL 是以 页 为基本单位来管理存储空间的我们的记录都会被分配到某个 页 中存储。而一个页的大小一般是 16KB 也就是 16384 字节而一个 VARCHAR(M) 类型的列就最多可以存储 65532 个字节这样就可能造成一个页存放不了一条记录的尴尬情况。
在 Compact 和 Reduntant 行格式中对于占用存储空间非常大的列在 记录的真实数据 处只会存储该列的一部分数据把剩余的数据分散存储在几个其他的页中然后 记录的真实数据 处用20个字节存储指向这些页的地址当然这20个字节中还包括这些分散在其他页面中的数据的占用的字节数从而可以找到剩余数据所在的页如图所示 从图中可以看出来对于 Compact 和 Reduntant 行格式来说如果某一列中的数据非常多的话在本记录的真实数据处只会存储该列的前 768 个字节的数据和一个指向其他页的地址然后把剩下的数据存放到其他页中这个过程也叫做 行溢出 存储超出 768 字节的那些页面也被称为 溢出页 。
4.4 总结
1. 页是 MySQL 中磁盘和内存交互的基本单位也是 MySQL 是管理存储空间的基本单位。
2. 指定和修改行格式的语法如下
CREATE TABLE 表名 (列的信息) ROW_FORMAT行格式名称
ALTER TABLE 表名 ROW_FORMAT行格式名称
3. InnoDB 目前定义了4种行格式
COMPACT行格式
具体组成如图 Redundant行格式
具体组成如图 Dynamic和Compressed行格式
这两种行格式类似于 COMPACT行格式 只不过在处理行溢出数据时有点儿分歧它们不会在记录的真实数据处存储字符串的前768个字节而是把所有的字节都存储到其他页面中只在记录的真实数据处存储其他页面的地址。
另外 Compressed 行格式会采用压缩算法对页面进行压缩。
4. 一个页一般是 16KB 当记录中的数据太多当前页放不下的时候会把多余的数据存储到其他页中这种现象称为 行溢出 。