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)使用不一樣數量的頁面頭部和尾部的數據,它影響行的存儲量。

相關文章
相關標籤/搜索