我测试了一下innodb的存储
CREATE  TABLE IF NOT EXISTS test.tb_varchar (
  user_varchar varchar(20) NOT NULL )
ENGINE = InnoDB
DEFAULT CHARACTER SET = gb2312
COLLATE = gb2312_chinese_ci
然后批量插入了1W条记录,值都相同
INSERT INTO tb_varchar(user_varchar) VALUES ('1111111111');然后查看information_schema.tables对应avg_rowlength:40  data_length:409600这个单位应该是字节吧,为什么一行记录就用掉了40个字节?

解决方案 »

  1.   

    《MYSQL技术内幕:INNODB存储引擎》这本书上说得很清楚。
      

  2.   

    说起这个问题我也想了解一下,有找到一个文章大体能了解到存储结构了,原文链接和文章全文摘录如下: 
    http://hi.baidu.com/soyah/blog/item/0fe2bc8a12905508c9fc7af4.html
    ----
    1. Compact行记录格式Compact行记录是在MySQL5.1时被引入的,其设计目标是能为高效存放数据.简单来说,就是一个页存放的行数据越多,其性能就越高.compact按照以下格式进行存放变长字段长度列表   Null标志位     记录头信息  列1数据….列n数据变长字段长度列表:compact行格式的首部是一个非NULL变长字段长度列表,而是按照列的顺序逆序放置的:当列的长度小于255字节,用1字节表示当大于255字节,用2字节表示变长字段的长度最大不可能超过2个字节(MySQL中varchar的最大长度为65535,因为2个字节为16位.)NULL标志位:该位指示了该行数据中是否有NULL值,用1表示。该部分所占字节应该为bytes.记录头信息:固定占用5个字节(40位).最后就是实际数据存放的地方了.注:每行数据除了用户定义的列外,还有两个隐藏列,事务ID和回滚指针列,分别为6个字节和7个字节大小.若innoDB表没有定义Promary Key每行还会增加一个6字节的RowID列.2 Redundant行记录格式Redundant是MySQL5.1版本之前InnoDB的行记录存储方式,MySQL5.1支持Redundant是为了向前兼容性.格式如下:字段长度偏移列表  记录头信息  列1数据….. 第一:长度偏移列表,同样按照顺序逆序放置的,当列的长度小255字节用1个字节表示,若大于255字节,用2他字节表示.第二:记录头信息:固定占用6个字节.行溢出数据InnoDB存储引擎可以将一条记录的某此数据存储在真正的数据页之外,即用为行溢出数据,一般为BLOB,lob这类的大对象列类型的存储会把数据存放数据页之外.
      

  3.   

    http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html
    MYSQL HELP上有说明
      

  4.   

    我看了下,我的行记录确实是Compact,所以也可以解释多出的这些字节数。但是我将此表结构修改为两个char(20)的字段后,还是1w记录,对应avg_rowlength变为150。
    对应三个char(20)的字段后,1w记录,对应avg_rowlength还是150。
    对应四个char(20)的字段后,1w记录,对应avg_rowlength还是150。这个又怎么解释呢?
      

  5.   

    这都是drop掉重建的,后面多个char字段都是建不同的表试的。
      

  6.   

    给你一个PPT,关于InnoDB引擎的内部架构的,一看就会明白了,数据不存只是字段和索引值所占的空间,还有各种指针,PPT链接地址:http://www.mysqlops.com/2011/08/27/innodb-internal.html
    #*********************#
    技术网站:www.mysqlops.com
    新浪微博:http://weibo.com/mysqlops
    #*********************#
      

  7.   

    CREATE  TABLE IF NOT EXISTS test.tb_varchar (
      user_varchar varchar(20) NOT NULL )
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = gb2312
    COLLATE = gb2312_chinese_ci