专栏名称: DBAplus社群
围绕数据库、大数据、PaaS云,顶级大咖、技术干货,运营几个月受众过十万!成为运维圈最专注围绕“数据”的学习交流和专业社群!欢迎投稿,加入探讨。
目录
相关文章推荐
51好读  ›  专栏  ›  DBAplus社群

为什么阿里不建议MySQL使用text类型?

DBAplus社群  · 公众号  · 数据库  · 2020-12-15 07:15

正文

请到「今天看啥」查看全文


L + 3 bytes, where L < 2**24 LONGTEXT L + 4 bytes, where L < 2**32


其中L表是text类型中存储的实际长度的字节数。可以计算出TEXT类型最大存储长度2**16-1 = 65535 Bytes。


InnoDB数据页

Innodb数据页由以下7个部分组成:


内容 占用大小 说明
File Header 38Bytes 数据文件头
Page Header 56 Bytes 数据页头
Infimun 和 Supermum Records
伪记录
User Records
用户数据
Free Space
空闲空间:内部是链表结构,记录被delete后,会加入到free_lru链表
Page  Dictionary
页数据字典:存储记录的相对位置记录,也称为Slot,内部是一个稀疏目录
File Trailer 8Bytes 文件尾部:为了检测页是否已经完整个的写入磁盘


说明:File Trailer只有一个FiL_Page_end_lsn部分,占用8字节,前4字节代表该页的checksum值,最后4字节和File Header中的FIL_PAGE_LSN,一个页是否发生了Corrupt,是通过File Trailer部分进行检测,而该部分的检测会有一定的开销,用户可以通过参数innodb_checksums开启或关闭这个页完整性的检测。


从MySQL 5.6开始默认的表存储引擎是InnoDB,它是面向ROW存储的,每个page(default page size = 16KB),存储的行记录也是有规定的,最多允许存储16K/2 - 200 = 7992行。


InnoDB的行格式


Innodb支持四种行格式:



由于Dynamic是Compact变异而来,结构大同而已,现在默认都是Dynamic格式;COMPRESSED主要是对表和索引数据进行压缩,一般适用于使用率低的归档,备份类的需求,主要介绍下REDUNDANT和COMPACT行格式。


Redundant行格式


这种格式为了兼容旧版本MySQL。


行记录格式:



具有以下特点:


  • 存储变长列的前768 Bytes在索引记录中,剩余的存储在overflow page中,对于固定长度且超过768 Bytes会被当做变长字段存储在off-page中;

  • 索引页中的每条记录包含一个6 Bytes的头部,用于链接记录用于行锁;

  • 聚簇索引的记录包含用户定义的所有列。另外还有一个6字节的事务ID(DB_TRX_ID)和一个7字节长度的回滚段指针(Roll pointer)列;

  • 如果创建表没有显示指定主键,每个聚簇索引行还包括一个6字节的行ID(row ID)字段;

  • 每个二级索引记录包含了所有定义的主键索引列;

  • 一条记录包含一个指针来指向这条记录的每个列,如果一条记录的列的总长度小于128字节,这个指针占用1个字节,否则2个字节。这个指针数组称为记录目录(record directory)。指针指向的区域是这条记录的数据部分;

  • 固定长度的字符字段比如CHAR(10)通过固定长度的格式存储,尾部填充空格;

  • 固定长度字段长度大于或者等于768字节将被编码成变长的字段,存储在off-page中;

  • 一个SQL的NULL值存储一个字节或者两个字节在记录目录(record dirictoty)。对于变长字段null值在数据区域占0个字节。对于固定长度的字段,依然存储固定长度在数据部分,为null值保留固定长度空间允许列从null值更新为非空值而不会引起索引的分裂;

  • 对varchar类型,Redundant行记录格式同样不占用任何存储空间,而CHAR类型的NULL值需要占用空间。


其中变长类型是通过长度 + 数据的方式存储,不同类型长度是从1到4个字节(L+1 到 L + 4),对于TEXT类型的值需要L Bytes存储value,同时需要2个字节存储value的长度。同时Innodb最大行长度规定为65535 Bytes,对于text类型,只保存9到12字节的指针,数据单独存在overflow page中。







请到「今天看啥」查看全文