01
—
目录
02
—
前言
最近一个朋友遇到一个面试题:MySQL的InnoDB的一个表最多能存多少数据?这么一问,我瞬间也蒙圈了,这是我的知识盲区啊,之前还从来没考虑过这样的问题。那我怎么能甘心的,只好去网上一顿查资料,下面我就分享一下我查到的结果。版本Mysql8.0。03
—
表的最大大小
表的最大大小也是表空间的最大大小。最小表空间大小略大于10MB。最大表空间大小取决于InnoDB
页面大小。InnoDB页面大小 | 最大表空间大小 |
---|---|
4KB | 16TB |
8KB | 32TB |
16KB | 64TB |
32KB | 128TB |
64KB | 256TB |
InnoDB
限制。如果需要大型系统表空间,请使用几个较小的数据文件(而不是一个大型数据文件)进行配置,或者在每个表文件和常规表空间数据文件之间分配表数据。看完这个发现,居然不是一个固定的答案。。。它会跟InnoDB
设置的页面大小有关。。。(内心呐喊!)了解了这一个,我们接着来看看还有哪些我们都没考虑过的“奇奇怪怪”的限制~04
—
列的最大数量
这是一个坑点!为什么这么说?因为InnoDB的限制和MySQL的限制不一样!!!InnoDB
一个表最多可以包含1017列。虚拟生成的列包含在此限制中。
MySQL
对每个表有4096列的硬限制,但是对于给定的表,有效最大值可能会更少。确切的列限制取决于几个因素:看着头都大了。。。
一个表的最大行大小限制了列的数量(可能还有大小),因为所有列的总长度不能超过该大小。
单个列的存储要求限制了给定最大行大小内的列数。某些数据类型的存储要求取决于存储引擎,存储格式和字符集等因素。
存储引擎可能会施加其他限制表列计数的限制。例如,
InnoDB
每个表的限制为1017列。功能键部分被实现为隐藏的虚拟生成的存储列,因此表索引中的每个功能键部分都计入表的总列数限制。
05
—
行大小限制
给定表的最大行大小由几个因素决定:
MySQL
表的内部表示具有65,535字节的最大行大小限制,即使存储引擎能够支持更大的行也是如此。BLOB
和TEXT
列仅有助于朝向行大小限制9〜12字节,因为它们的内容是从该行的其余部分分开存储。InnoDB
对于4KB,8KB,16KB和32KBinnodb_page_size
设置,表 的最大行大小(适用于本地存储在数据库页面内的数据)略小于页面的一半 。例如,对于默认的16KBInnoDB
页面大小,最大行大小略小于8KB 。对于64KB页面,最大行大小略小于16KB。LONGBLOB
和LONGTEXT
列必须小于4GB,并且总行大小(包括BLOB和 TEXT列)必须小于4GB。不同的存储格式使用不同数量的页面标题和尾部数据,这会影响行可用的存储量。
行大小限制示例:
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 usedtable 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字节的行大小限制,而InnoDB
变长列的页外存储可以避免 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)
06
—
索引限制
InnoDB
一个表最多可以包含64个二级索引。对于
InnoDB
使用表DYNAMIC
(MySQL8.0默认行格式)或COMPRESSED
行格式的表, 索引键前缀长度限制为3072字节 。对于使用
REDUNDANT
或COMPACT行
格式的InnoDB
表,索引键前缀长度限制为767个字节。例如,假设utf8mb4
字符集且每个字符最多4个字节,则您可能在TEXT
或VARCHAR
列上使用超过191个字符的列前缀索引来达到此限制。尝试使用超出限制的索引键前缀长度将返回错误。
如果在创建
MySQL
实例时通过指定选项将InnoDB
页面大小减小到8KB或4KBinnodb_page_size
,则基于16KB页面大小的3072个字节的限制,按比例减小索引键的最大长度。即,当页面大小为8KB时,最大索引键长度为1536字节,而当页面大小为4KB时,最大索引键长度为768字节。适用于索引键前缀的限制也适用于全列索引键。
多列索引最多允许16列。超过限制将返回错误。
ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed
07
—
结语
这些限制平时真的是没接触过,不过居然有人面试会问这个东西,想想都很可怕。
内容都来自MySQL
官网~感兴趣的可以去点击“查看原文”去官网看。不得不说,官网的资料是真全啊,就是看完之后发现自己对MySQL
其实是一无所知。。。如有错误,欢迎指出。
欢迎大家关注我的个人技术分享公众号,可以推荐身边的朋友关注哦~
点此留言