10.4 限制表的列数和行的大小


官方地址: http://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html html


每一个表中硬性规定,就是最多只容许存储4096个列,有效的最大值可能小于给定的表,确切的限制取决于几个相互做用的因素。mysql


1.每一个表(不关心存储引擎)单行最大值占65535字节。存储引擎可能会在这个限制上放置额外的约束,以减小有效的最大行大小。sql

  最大行大小限制了咧的数量(可能存储大小),由于全部列的总长度不能超过这个大小数据库

  例如: 每一个UTF8字符须要3个字节。服务器

  因此一个char(255) UTF8 字符集的列。服务器必须为每一个值分配 255 x 3 = 765字节,所以,一个表不能包含65535 / 765 = 85 个这样的列。ide


  可变长度列的存储包括长度和字节。这是对行大小的评估。spa

  例如,一个varchar(255) UTF8字符集的列须要两个字节来存储值得长度。htm

  因此每一个值能够占用767个字节。get


  BLOB 和 TEXT 字段计数, 由于它们的内容分别存储在该行的其他部分中。it

  对每行大小的限制,从1到4 + 8字节的数值。


  声明列的NULL值能够减小容许列的最大数量值。

  对于MyISAM表,NULL列须要额外的空间来记录它们的行是否值是NULL。每一个NULL列须要一个额外的,四舍五入到最近的字节

  字节的最大行长度能够计算以下:

  row length = 1

             + (sum of column lengths)

             + (number of NULL columns + delete_flag + 7)/8

             + (number of variable-length columns)


   delete_flag = 1 是静态的格式表。静态表在行记录中使用一个bit表示,指示该行是否已经被删除的标识位。

   delete_flag 0 动态表,由于flag标识 存储的动态行标头。

   对于MyISAM表格式的信息,请参见第16.2.3,“MyISAM表的存储格式”。


   在InnoDB表中,是NULL列仍是非NULL列,存储大小相同。因此前面的计算不适用。

   下面的语句建立t1表成功,由于列须要 32,765 + 2 字节 和 32,766 + 2 字节, 

   他最大行大小为 65535字节。


   mysql> CREATE TABLE t3

       -> (c1 VARCHAR(65535) NOT NULL)

       -> ENGINE = MyISAM CHARACTER SET latin1;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

减小列长度从65533甚至更少能够建立成功。



 2.单个存储引擎可能会对限制表列数施加额外的限制。例如:

    (1)InnoDB 容许多达 1000个列。

    (2)InnoDB 限制行大小略少于一半的数据库页为4KB,8KB、16KB、32KB的页面大小。对于一个64KB页面大小限制,InnoDB行大小约16000字节。

       针对可变长度列(VARBINARY, VARCHAR, BLOB, and TEXT) 行大小限制不一样。

    (3)不一样的InnoDB存储格式(COMPRESSED、REDUNDANT)使用不一样数量的页面头部和尾部的数据,它影响行的存储量。

相关文章
相关标签/搜索