MySQL 行溢出数据

MySQL 行溢出数据

MySQL 对一条记录占用的最大储存空间是有限制的,除了 BLOB 和 TEXT 类型以外,其余全部列 (不包括隐藏列和记录头信息) 占用的字节长度不能超过 65535 个字节,当记录长度超过限制时,MySQL 会建议使用 TEXT 或 BLOB 类型mysql

储存数据

储存上限 65535 个字节不只包含自己的数据,还包含一些其余数据 (storage overhead),以 VERCHAR 类型为例,共须要 3 部分储存空间:sql

  • 真实数据
  • 真实数据占用的字节长度
  • NULL 值标识,NOT NULL 列没有这部分

当使用 ascii 字符集时:若是 '真实数据占用的字节长度' 占用两个字节,NULL 值标识占用一个字节,则真实数据最多只能存储 65532 个字符
当使用 utf8 字符集时:若是 '真实数据占用的字节长度' 占用两个字节,NULL 值标识占用一个字节,则真实数据最多只能存储 21844 (65532 / 3) 个字符ci

行溢出

因为 MySQL 中以页为基本单位来管理储存空间的,全部的记录都会被分配到页中
因为一个页通常为 16KB (16384 个字节),而一个 VERCHAR 最多能够存储 65532 个字节,因此会出现一个页存放不下一条记录的状况,形成行溢出
不只是 VERCHAR,BLOB 和 TEXT 也会发生行溢出sed

存储方式

对于不一样行格式,有不一样储存溢出页的方式链表

Compact & Reduntant

当发生行溢出时,在 Compact 和 Reduntant 中,'记录的真实数据' 处只会存储一部分 (768 字节的) 数据,剩下的数据存储在几个其余的页 (溢出页) 中 (以链表的方式链接),在 '记录的真实数据' 处用 20 个字节存储这些页的地址 (包含分散在其余页面中的数据的占用的字节数)数据

Dynamic & Compressed

它们不会在 '记录的真实数据' 处储存真实数据的前 768 个字节,而是把全部的字节都存储到其余页面中,只储存其余页面的地址ant

相关文章
相关标签/搜索