varchar or blob:字段类型的存储和溢出条件

遇到大字段存储的时候,是使用长varchar还是blob(text)?

行模式不同,行溢出的行为也不同:
下面介绍不同行模式的表现:
row format:
compact:
1、compact格式的首部是一个非空的变长字段长度列表,按照列的顺利逆序放置,
   当列长度<255的时候,用一个字节表示;>255的时候用2个字节表示,变长字
   段最大值2个字节(mysql的varchar最大长度2的16次方=65535)
2、第二部分是NULL标志位,表示该行是否有NULL值,用1表示。该部分的单位是
   bytes。
3、行记录头:固定占用5个字节(40位),分布如下:
   1  未知
   1  未知
   1  deleted_flag 删除标记
   1  min_rec_flag 为1,如果该记录是预先被定为最小的记录
   4  n_owned 改记录拥有的记录数
   13 heap_no 索引堆中该记录的排序记录
   3  record_type 记录类型 000=普通 001=B+树节点指针 010=informum
      011=superemum 1xx=保留
   16 next_recorder 页中下一条记录的相对位置:(innodb引擎在页内部是通过链
      表来串联各行记录的)
4、数据记录行:NULL不占用该部分的任何数据(NULL除了占用NULL标志位,实际存储
   不占用任何空间) 每行行除了用户定义的数据,还有两个隐藏列:事务ID列(6字节)和
  回滚指针列(7字节),如果没有定义主键,每行还会增加一个rowid列(6字节)

5、使用 hexdump -C [-v] table.ibd验证

redundant:
mysql5.0之前的行记录格式,跟compact记录格式不同:
NULL的varchar不占用空间,而空的char需要占用



compact和redundant行溢出:
1、如果一个能够至少放入两行,varchar就不会放到blob页中,这个
   阈值是8098,超过阈值,数据页保存768个字节,剩余保存到blob页
  (实验:py_innodb_page_info, create table t(a  varchar(9000)),
    repeat('a',8098))
2、blob(text)表也不是全部存储到blob页,只有超出限制(8098)才会放置
   到blob页(实验:同上); 当blob列发生行溢出的时候数据页保存
   768个字节,剩余的保存的blob页


compact、redundant统称:antelope
compressed、dynamic统称:barracuda

dyanmic,compressed格式:
溢出使用完全的行溢出模式(溢出阈值也是8098),在数据页只存放20个字节的指针,
实际的数据都存放到blob页中。
compressed格式的另外一个功能就是存储的行数据会使用zlib的算法进行压缩,
对blob,text,varchar这类的长类型能进行有效的存储。



总上:
1、在存储大字段类型的时候使用blob(比如图片等)
2、在需要建索引的时候使用varchar(blob不能建立索引,可以使用前缀索引)
3、大字段类型不能有默认值,有默认值的场合使用varchar
4、varchar有长度限制,表的所有varchar列之和不能超过65535
5、使用大字段类型的时候,尽量使用的少,避免使用多个
6、存储长字符串的时候看varchar和blob好像没有太大的性能差异(varchar是
   字符比较,blob是二进制流对比效率会高一些)

参考:
http://www.percona.com/blog/2010/02/09/blob-storage-in-innodb/
《mysql技术内幕innodb存储引擎》

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20625855/viewspace-1453859/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20625855/viewspace-1453859/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值