现在的位置: 首页 > 综合 > 正文

在innodb中的blob字段怎样存储?

2013年12月06日 ⁄ 综合 ⁄ 共 1369字 ⁄ 字号 评论关闭

Blob Storage in Innodb
http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/

innodb行格式介绍
http://www.innodb.com/doc/innodb_plugin-1.0/innodb-row-format.html

一、innodb行格式
(1)REDUNDANT和COMPACT格式,被命名为“Antelope”
REDUNDANT:MySQL 4.1 and below
COMPACT:MySQL 5.0 and above(默认的)

相关特征:
1)每一个页面至少存储2行,因此如果一行要完全存储在此页面中,那个此行数据限制为8000bytes
2)如果一个带blob列的行的大小小于上述限制,那么此行的所有数据将存储在一个页面中;否则,会将blob列的前768bytes存储在此页面中,其他的数据存储在额外的页面中。假设一行有两个7k的blob列数据,那么会将第一个blob列数据存储在此页面中,第二个blob列的头768bytes存储在此页面中,而第二个blob列中的其他存储在其他页面中。
3)存储blob列的前768bytes字节的原因是:可以很容易的实现blob列前缀索引
4)这个768bytes的决定造成了一个bugs:那是你可以存储200K Blob数据,但是你不能存储一个20字节的数据
5)外部用于存储blob数据的页面不是共享的。假设一个blob列多出了一个字节需要存储,那么将分配一个16K大小的页面,并且这个页面不能被其他的blob列数据使用。所以应当避免同一行中使用多个blob列,建议将多个blob列合并为一个。
6)如果所有的blob列都不适合于页,那么mysql会用外部页面选择其中的一个blob列进行存储,这取决于不同行的列的大小情况。因此,可以不同的行选择不同的blob列来进行外部存储。

缺点:
因为在innodb中一个b-tree结点所存储的是key+row data,所以如果一个页面中能够存储更多的数据,即存储更多的行,那么在搜索时会达到更多的效率。假如有blob列数据,利用上面的存储格式会造成效率的降低。因为在一个页面中如果存储了blob列的数据,那么会造成存储的行数据的减少,因此搜索时的效率会下降。如果要是使blob列的数据用分离的页面存储,那么存储的行数据会更多,搜索效率会更高。

(2)ROW_FORMAT=DYNAMIC(被命名为Barracuda)
相关特征:
1)要么存储所有行数据(包括blob列数据)在一个页面,要么只存储20bytes的指针在页面中,而利用外部页面存储blob列数据。
2)COMPRESSED格式比DYNAMIC更小,其他同DYNAMIC格式

BLOB、TEXT、VARCHAR存储的格式是相同的。因此,上述也适用于TEXT、VARCHAR。

通过以上描述,可以得出:
(1)如果预期blob的数据较少,并且整行的数据可以小于8000bytes,而且查询一般是以单行查询为主,那么用“REDUNDANT和COMPACT格式”比较好。
(2)如果预期blob的数据较多,并且查询经常返回一个范围的结果集,那么用DYNAMIC较好。
(3)使用COMPRESSED会消耗更多的CPU时间。

抱歉!评论已关闭.