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

分類:IT技術 時間:2016-10-14

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

每個表中硬性規定,就是最多只允許存儲4096個列,有效的最大值可能小於給定的表,確切的限制取決於幾個相互作用的因素。

1.每個表(不關心存儲引擎)單行最大值占65535字節。存儲引擎可能會在這個限制上放置額外的約束,以減少有效的最大行大小。

  最大行大小限制了咧的數量(可能存儲大小),因為所有列的總長度不能超過這個大小

  例如: 每個UTF8字符需要3個字節。

  所以一個char(255) UTF8 字符集的列。服務器必須為每個值分配 255 x 3 = 765字節,因此,一個表不能包含65535 / 765 = 85 個這樣的列。

  可變長度列的存儲包括長度和字節。這是對行大小的評估。

  例如,一個varchar(255) UTF8字符集的列需要兩個字節來存儲值得長度。

  所以每個值可以占用767個字節。

  BLOB 和 TEXT 字段計數, 因為它們的內容分別存儲在該行的其余部分中。

  對每行大小的限制,從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)使用不同數量的頁面頭部和尾部的數據,它影響行的存儲量。

本文出自 “會飛的螞蟻” 博客,謝絕轉載!


Tags: 服務器 number 最大值 記錄 空間

文章來源:


ads
ads

相關文章
ads

相關文章

ad