亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL表列數(shù)和行大小限制示例詳解

 更新時間:2024年04月13日 11:58:22   作者:EulerBlind  
行是表中存儲數(shù)據(jù)的行,也稱為記錄,MySQL的行上限主要受限于兩個因素,表的大小和操作系統(tǒng)的限制,這篇文章主要給大家介紹了關于MySQL表列數(shù)和行大小限制的相關資料,需要的朋友可以參考下

前言

MySQL是一種常用的關系型數(shù)據(jù)庫管理系統(tǒng),廣泛用于Web應用程序的開發(fā)和數(shù)據(jù)存儲。在使用MySQL的過程中,了解表格列數(shù)和行大小的限制是至關重要的,因為它們直接影響到數(shù)據(jù)庫的設計和性能。本文將深入探討MySQL中列數(shù)和單個行大小的限制。

限制維度

列數(shù)量限制

MySQL對每個表設置了硬限制,即每個表最多有4096列,但對于給定的表,實際最大列數(shù)可能會更少。確切的列限制取決于多個因素:

表的最大行大小

表的最大行大小限制了列數(shù)(可能還包括列的大?。?,因為所有列的總長度不能超過這個大小。有關更多信息,請參閱行大小限制。

單個列的存儲要求

單個列的存儲要求會限制適應給定最大行大小的列數(shù)。不同數(shù)據(jù)類型的存儲要求取決于存儲引擎、存儲格式和字符集等因素。

存儲引擎的附加限制

存儲引擎可能會施加額外的限制,進一步限制表的列數(shù)。例如,InnoDB對每個表有一個1017列的限制。

功能鍵部分

功能鍵部分(“CREATE INDEX Statement”)被實現(xiàn)為隱藏的虛擬生成的存儲列,因此表索引中的每個功能鍵部分都計入表的總列限制。

行容量限制

給定表的行容量大小由多個因素決定

MySQL表的內(nèi)部實現(xiàn)

MySQL表的內(nèi)部實現(xiàn)對行的最大大小設定了一個限制,即使存儲引擎能夠支持更大的行。BLOB和TEXT列僅對行大小限制貢獻了9到12字節(jié),因為它們的內(nèi)容存儲在行的其余部分之外。

InnoDB表的最大行大小

對于InnoDB表,其最大行大小適用于存儲在數(shù)據(jù)庫頁面內(nèi)的本地數(shù)據(jù),對于4KB、8KB、16KB和32KB的innodb_page_size設置,最大行大小略小于頁面的一半。例如,默認的16KB InnoDB頁面大小的最大行大小略小于8KB。對于64KB頁面,最大行大小略小于16KB。

超出InnoDB最大行大小的處理

如果包含變長列的行超過了InnoDB最大行大小,InnoDB會選擇將變長列存儲在頁面外,直到行適應InnoDB行大小限制。存儲在本地的存儲在頁面外的可變長度列的數(shù)據(jù)量因行格式而異。

不同存儲格式的影響

不同的存儲格式使用不同數(shù)量的頁面頭部和尾部數(shù)據(jù),這會影響可用于行的存儲量

  • InnoDB行格式
  • MyISAM存儲格式

限制示例

行大小限制示例

MySQL的最大行大小限制為65,535字節(jié),以下是對InnoDB和MyISAM示例的演示。盡管存儲引擎可能支持更大的行,但這個限制是強制執(zhí)行的,與存儲引擎無關。

InnoDB下

mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
       f VARCHAR(10000), g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs

在InnoDB表中,將列更改為TEXT成功進行的原因是,這樣的變更避免了MySQL的65,535字節(jié)行大小限制,并且InnoDB對可變長度列的頁外存儲也規(guī)避了InnoDB行大小限制。

mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
       f VARCHAR(10000), g TEXT(6000)) ENGINE=InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)

MyISAM下

mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
       f VARCHAR(10000), g VARCHAR(6000)) 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. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs

在以下的MyISAM示例中,將列更改為TEXT可以避免65,535字節(jié)的行大小限制,并且允許操作成功進行,因為BLOB和TEXT列僅對行大小貢獻了9到12字節(jié)。

mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
       f VARCHAR(10000), g TEXT(6000)) ENGINE=MyISAM CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)

InnoDB變長情況示例

可變長度列的存儲包括長度字節(jié),這些字節(jié)計入行大小。例如,一個VARCHAR(255) CHARACTER SET utf8mb3列占用兩個字節(jié)來存儲值的長度,因此每個值最多可以占用767字節(jié)。

以下是創(chuàng)建表t1的語句,成功的原因是這些列需要32,765 + 2字節(jié)和32,766 + 2字節(jié),總大小在65,535字節(jié)的最大行大小范圍內(nèi):

mysql> CREATE TABLE t1
       (c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL)
       ENGINE = InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)

創(chuàng)建表t2的語句失敗,盡管列的長度在65,535字節(jié)的最大長度范圍內(nèi),但仍需要額外的兩個字節(jié)來記錄長度,導致行大小超過了65,535字節(jié):

mysql> CREATE TABLE t2
       (c1 VARCHAR(65535) NOT NULL)
       ENGINE = InnoDB CHARACTER SET latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs

減小列的長度至65,533或更低可以使創(chuàng)建表的操作成功。例如:

mysql> CREATE TABLE t2
       (c1 VARCHAR(65533) NOT NULL)
       ENGINE = InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.01 sec)

MyISAM變長情況示例

對于MyISAM表,NULL列需要額外的空間來記錄它們的值是否為NULL。每個NULL列需要額外的一位,四舍五入到最近的字節(jié)。

創(chuàng)建表t3的語句失敗,因為MyISAM除了需要為可變長度列的長度字節(jié)分配空間外,還需要為NULL列分配空間,導致行大小超過了65,535字節(jié):

mysql> CREATE TABLE t3
       (c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) 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. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs

行大小限制示例

InnoDB限制行大?。▽τ诖鎯υ跀?shù)據(jù)庫頁面內(nèi)的本地數(shù)據(jù))略小于4KB、8KB、16KB和32KB的innodb_page_size設置的一半,并且略小于64KB頁面的16KB。

以下是創(chuàng)建表t4的語句,由于定義的列超過了16KB InnoDB頁面的行大小限制,因此操作失敗:

mysql> CREATE TABLE t4 (
       c1 CHAR(255),c2 CHAR(255),c3 CHAR(255),
       c4 CHAR(255),c5 CHAR(255),c6 CHAR(255),
       c7 CHAR(255),c8 CHAR(255),c9 CHAR(255),
       c10 CHAR(255),c11 CHAR(255),c12 CHAR(255),
       c13 CHAR(255),c14 CHAR(255),c15 CHAR(255),
       c16 CHAR(255),c17 CHAR(255),c18 CHAR(255),
       c19 CHAR(255),c20 CHAR(255),c21 CHAR(255),
       c22 CHAR(255),c23 CHAR(255),c24 CHAR(255),
       c25 CHAR(255),c26 CHAR(255),c27 CHAR(255),
       c28 CHAR(255),c29 CHAR(255),c30 CHAR(255),
       c31 CHAR(255),c32 CHAR(255),c33 CHAR(255)
       ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARSET latin1;
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help.
In current row format, BLOB prefix of 0 bytes is stored inline.

總結 

到此這篇關于MySQL表列數(shù)和行大小限制的文章就介紹到這了,更多相關MySQL表列數(shù)和行大小限制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mysql數(shù)據(jù)校驗過程中的字符集問題處理

    mysql數(shù)據(jù)校驗過程中的字符集問題處理

    在日常應用中,我們經(jīng)常會遇到在不同的字符集的數(shù)據(jù)庫直接進行數(shù)據(jù)的導入導出操作,針對這個問題,我們來進行討論下
    2014-05-05
  • MySQL數(shù)據(jù)庫怎么正確查詢字符串長度

    MySQL數(shù)據(jù)庫怎么正確查詢字符串長度

    MySQL中字符串長度一般指數(shù)據(jù)庫表中一個字段或列中存儲的字符串的最大長度,有時我們需要測量字符串長度,來保證表結構及數(shù)據(jù)庫性能穩(wěn)定,下面這篇文章主要給大家介紹了關于MySQL數(shù)據(jù)庫怎么正確查詢字符串長度的相關資料,需要的朋友可以參考下
    2023-06-06
  • Mysql排序和分頁(order by&limit)及存在的坑

    Mysql排序和分頁(order by&limit)及存在的坑

    這篇文章主要介紹了Mysql排序和分頁(order by&limit)及存在的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Mysql中的默認存儲引擎

    Mysql中的默認存儲引擎

    這篇文章主要介紹了Mysql中的默認存儲引擎方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • SELinux導致PHP連接MySQL異常Can''t connect to MySQL server的解決方法

    SELinux導致PHP連接MySQL異常Can''t connect to MySQL server的解決方法

    這篇文章主要介紹了SELinux導致PHP連接MySQL異常Can't connect to MySQL server的解決方法,有2種,一是設置允許,二是關閉SELinux,需要的朋友可以參考下
    2014-07-07
  • DBeaver連接mysql和oracle數(shù)據(jù)庫圖文教程

    DBeaver連接mysql和oracle數(shù)據(jù)庫圖文教程

    DBeaver是一款免費的數(shù)據(jù)庫管理工具,支持多種數(shù)據(jù)庫,包括MySQL,下面這篇文章主要給大家介紹了關于DBeaver連接mysql和oracle數(shù)據(jù)庫的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Mysql技術內(nèi)幕之InnoDB鎖的深入講解

    Mysql技術內(nèi)幕之InnoDB鎖的深入講解

    這篇文章主要給大家介紹了關于Mysql技術內(nèi)幕之InnoDB鎖的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • mysql查看死鎖與去除死鎖示例詳解

    mysql查看死鎖與去除死鎖示例詳解

    這篇文章主要給大家介紹了關于mysql查看死鎖與去除死鎖的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 教你如何讓spark?sql寫mysql的時候支持update操作

    教你如何讓spark?sql寫mysql的時候支持update操作

    spark提供了一個枚舉類,用來支撐對接數(shù)據(jù)源的操作模式,本文重點給大家介紹如何讓spark?sql寫mysql的時候支持update操作,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2022-02-02
  • Mysql 分批加索引的詳細方法

    Mysql 分批加索引的詳細方法

    文章主要介紹了在生產(chǎn)環(huán)境中為千萬級數(shù)據(jù)表分批次創(chuàng)建索引的策略和方法,包括使用臨時表、分區(qū)表、ONLINE選項、分批ALTER TABLE、pt-online-schema-change工具等,并提供了詳細的步驟和注意事項,感興趣的朋友一起看看吧
    2024-12-12

最新評論