MyISAM行存储

MyISAM有3种行存储格式:fixed / dynamic / compressed

格式
说明
备注

 

fixed 

只有当表不包含变长字段(varchar/varbinary/blob/text)时使用,

该每行都是固定的,所以很容易获取行在页上的具体位置,

存取效率比较高,但是占用磁盘空间较多

默认格式

 

dynamic

每行都有一个行头部,包含bitmap,用以记录那些列为空(NULL列不算为空);

相比于fixed,其有如下特性:

所有字符串列都是动态存储的,除非长度小于4;

字符类型若长度为0/数字类型为0都会不占用存储空间,由bitmap标注,NULL值不包含在内;

如果要update行,其扩展后很容易导致行链接既而产生碎片,

一旦crash若link丢失则比较难恢复,fixed模式update不会产生碎片

 
compressed 只能通过myisampack创建且为只读  

MyISAM的索引文件包含一个flag记录基表是否正常关闭,如果mysqld启动时指定了--myisam-recover-options,则在打开表时检测并自动修复表

InnoDB行存储

Innodb plugin新引入Barracuda梭子鱼,其包含compressed/dynamic两种行格式,而之前的compact/redundant统属于antelope羚羊;

Barracuda VS antelope

由innodb_file_format(动态)参数决定,目前可选值由Antelope和Barracuda,默认为前者;要想要此参数生效,

因为共享表空间默认为Antelope,因此要想使用Barracuda为默认值,还必须先声明innodb_file_per_table;

Innodb_file_format用于控制行格式,全局变量可动态调整,5.5默认依旧是Antelope;

下面只看antelope格式

Redundant行结构

字段长度偏移列表

记录头信息

1数据

2数据

….

行头部为字段长度偏移信息,包括变长和非变长的, 还包含了3个隐藏列:RowID(没有主键时使用)/Transaction ID/Roll Point;而compact只包含变长的,节约了空间;

冗余行格式没有NULL标志位;对于redundant格式,varchar为Null时不占用空间,但是charNULL需要占用空间,因为其没有Null标志位;

记录头信息占用6个字节,比compact多1字节;

对于定长char,若为NULL依旧填充整个字段,而varchar为Null时不占用空间;

记录头信息,与compact相比,多了黑体字部分,缺失record_type

名称

长度bit

功能

Deleted_flag

1

是否被删除

Min_rec_flag

1

1则表示该记录为预先被定义的最小记录

N_owned

4

该记录拥有的总记录数

Heap_no

13

索引中该行的排序记录

N_fields

10

记录中列数量

1byte_offs_flag

1

偏移量列表是1字节还是2字节

Next_recorder

16

下一条记录相对位置

()

1

未知

()

1

未知

Create table test(t1 varchar(10), t2 varchar(10), t3 char(10),t4 varchar(10)) charset=latin1 row_format=redundant;

--该表有3个变长列

Insert into test values(‘a’,’bb’,’bb’,’ccc’);

使用hexdump –C –v test.idb查看其二进制代码

--长度偏移列表,

compact行格式

字段长度偏移列表

NULL标志位

记录头信息

1数据

2数据

….

5.0引入

行头存放该行内变长字段的length,当列小于255字节时占用1个字节,大于255而小于65535时占用2个字节;故varchar最大长度为2的16次方-1;

第2个指示该行是否有NULL值,占用1字节;NULL列不占用数据存储空间;

记录头信息:5个字节共计40bit,用于链接相邻的记录案的行级锁

名称

长度bit

功能

Deleted_flag

1

是否被删除

Min_rec_flag

1

1则表示该记录为预先被定义的最小记录

N_owned

4

该记录拥有的总记录数

Heap_no

13

索引中该行的排序记录

Record_type

3

行类型 0=普通 1=B+节点指针

Next_recorder

16

下一条记录相对位置

()

1

未知

()

1

未知

除此之外,每页还有两个隐含字段:

DB_TRX_ID:6字节,记录最近的一个事务标示符

DB_ROLL_ID:7字节,指向回滚日志记录

--若没有主键,则还会有DB_ROW_ID:6字节,包含在clustered索引中

创建一个compact行格式的表

Create table test(t1 varchar(10), t2 varchar(10), t3 char(10),t4 varchar(10)) row_format=compact;

--该表有3个变长列

Insert into test values(‘a’,’bb’,’bb’,’ccc’);

使用hexdump –C –v test.idb查看其二进制代码

第一行

03 02 01—变长字段长度列表(逆序),实际顺序为01 02 03,这也是t1,t2,t4的实际长度

00—Null标志位,第一行没有NULL

00 00 10 00 2c—记录头信息,5字节,后4个字节指向下一个记录next_recorder

00 00 00 2b 68 00—6字节rowid,因为没有主键

00 00 00 00 06 05 –事务ID,6字节

80 00 00 00 32 01 10—回滚指针,7字节

61 –列1

62 62 –列2

62 62 20 20 20 20 20 20 20 20 –列3,char会填充余下部分

63 63 63 –列4

余下的为列数据,其中t3由于采用固定长度,故会填充满10个字节;

第二行

Insert into test values(‘d’,null,null,’fff’);

03 01--变长字段长度列表,逆序

06-- Null标志位,有NULL值,转换为二进制00000110,表示第2/3列为null

……

64—列1数据

66 66 66—列4数据,而第2/3列为NULL不占用存储空间

注:对于redundant格式,varchar为Null时同样不占用空间,但是char为NULL需要占用空间,因为其没有Null标志位

行溢出

Innodb表为IOT,采用了B+数类型,故每个页面至少要存储2行数据,如果行过大则会产生行溢出;

理论上mysql的varchar可存储65525字节,强于oracle的4000,但对于InnoDB其实际上限为65532,且该值为表所有varchar列长度总和;对于utf8字符集,一个字符占3个字节,则其上限又缩小为1/3;

如果强行创建varchar(65535)的字段,在sql_mode不为restricted的情况下,其会被隐式转换为mediumtext;

不论是varchar还是blob/text,只要保证一个16k的页面能容下2行数据,应该不会行溢出;

而一旦行溢出,字段前768字节依旧存放于当前页面,数据一般使用B-tree Node页,而溢出的行存放于Uncompress Blob页;

而barracuda采用了完全行溢出,即只保留字段的前20字节;

MyISAM和InnoDB的行格式ROW_FORMAT的更多相关文章

  1. 数据页结构 .InnoDb行格式、以及索引底层原理分析

    局部性原理 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中. 首先要明白局部性原理能解决的是什么问题,也就是主存容量远远比缓存大, CP ...

  2. Mysql之InnoDB行格式、数据页结构

    Mysql架构图 存储引擎负责对表中的数据的进行读取和写入,常用的存储引擎有InnoDB.MyISAM.Memory等,不同的存储引擎有自己的特性,数据在不同存储引擎中存放的格式也是不同的,比如Mem ...

  3. 14.9 InnoDB Row Storage and Row Formats InnoDB 行存储和行格式:

    14.9 InnoDB Row Storage and Row Formats InnoDB 行存储和行格式: 14.9.1 Overview of InnoDB Row Storage 14.9.2 ...

  4. InnoDB行格式(compact,redundant)对照

    InnoDB行格式分两种格式(COMPACT,redundant)默觉得COMPACT compact的存储格式为 首部为一个非NULL的变长字段长度列表,并且是依照列的顺序逆序放置的,当列的长度小于 ...

  5. Mysql MyISAM与InnoDB 表锁行锁以及分库分表优化

    一. 两种存储引擎:MyISAM与InnoDB 区别与作用 1. count运算上的区别: 因为MyISAM缓存有表meta-data(行数等),因此在做COUNT(*)时对于一个结构很好的查询是不需 ...

  6. MyIsam与InnoDB主要区别

    MyIsam与InnoDB主要有以下4点大的区别,缓存机制,事物支持,锁定实现,数据物理存储方式(包括索引和数据). 1.缓存机制 myisam 仅仅缓存索引,不会缓存实际数据信息,他会将这一工作交给 ...

  7. 14.9.2 Specifying the Row Format for a Table 指定 表的行格式

    14.9.2 Specifying the Row Format for a Table 指定 表的行格式 mysql> SHOW TABLE STATUS\G; *************** ...

  8. MyIsam与InnoDB存储引擎主要区别

    MyIsam与InnoDB主要有以下4点大的区别,缓存机制,事务支持,锁定实现,数据物理存储方式(包括索引和数据). 1.缓存机制 myisam 仅仅缓存索引,不会缓存实际数据信息,他会将这一工作交给 ...

  9. MySQL中MyISAM与InnoDB的主要区别对比

    特征 MyISAM InnoDB 聚集索引 否 是 压缩数据 是(仅当使用压缩行格式时才支持压缩MyISAM表.使用压缩行格式和MyISAM的表是只读的.) 是 数据缓存 否 是 加密数据 是(通过加 ...

随机推荐

  1. 福大软工1816:Alpha(4/10)

    Alpha 冲刺 (4/10) 队名:Jarvis For Chat 组长博客链接 本次作业链接 团队部分 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.将中文分词.词频 ...

  2. lintcode-144-交错正负数

    144-交错正负数 给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组. 注意事项 不需要保持正整数或者负整数原来的顺序. 样例 给出数组[-1, -2, -3, 4, 5, 6],重新 ...

  3. Swift-assert使用时机

    什么时候使用断言呢? 包含下面的情况时使用断言: 1.整型下标索引作为值传给自定义索引实现的参数时,但下标索引值不能太低也不能太高时,使用断言 2.传值给函数但如果这个传过来的值无效时,函数就不能完成 ...

  4. TCP系列04—连接管理—3、TCP连接的半打开和半关闭

    在前面部分我们我们分别介绍了三次握手.四次挥手.同时打开和同时关闭,TCP连接还有两种场景分别是半打开(Half-Open)连接和半关闭(Half-Close)连接.TCP是一个全双工(Full-Du ...

  5. [CQOI2014]数三角形 组合数 + 容斥 + gcd

    推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...

  6. Linux相关——画图软件安装

    其实也不知道算不算Linux相关了... 装个画图软件还是很方便的,刚刚试了一下kolourpaint,感觉还行,就记录下来吧. 先记录几个快捷键emmmm print ---->全屏截图 al ...

  7. Retrofit工具类

    package com.example.week2.retrofitUtils; import android.util.Log; import com.example.week2.model.Con ...

  8. 最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )

    Lasso回归模型,是常用线性回归的模型,当模型维度较高时,Lasso算法通过求解稀疏解对模型进行变量选择.Lars算法则提供了一种快速求解该模型的方法.Lars算法的基本原理有许多其他文章可以参考, ...

  9. 存储引擎(Mysql)

    最常使用的2种存储引擎:1.Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam.每个MyISAM在磁盘上存储成三个文件.文件名都和表名相同, ...

  10. ContestHunter暑假欢乐赛 SRM 03

    你们也没人提醒我有atcoderQAQ... A题曼哈顿距离=欧拉距离就是在同一行或者同一列,记录下i,j出现过的次数,减去就行,直接map过. B题一开始拿衣服了,一直以为排序和不排序答案是一个样的 ...