首页 > 数据库 >【MySQL】 深入了解InnoDB存储引擎的限制

【MySQL】 深入了解InnoDB存储引擎的限制

时间:2024-03-14 20:00:34浏览次数:28  
标签:存储 限制 字节 TEXT varchar 索引 InnoDB MySQL 长度

目录

前言

1.mysql限制

1.1列数限制

1.2对全列索引键的限制

1.3行大小限制

1.4表空间大小限制

1.5表数量限制

2.mysql中的char与varchar

2.1varchar类型的变化

 2.1.1存储限制

2.1.2编码长度限制

2.1.3行长度限制

2.2CHAR(M), VARCHAR(M)不同之处

2.3VARCHAR和TEXT、BlOB类型的区别

2.4char,varchar和text的区别


前言

随着数据库技术的不断发展,了解不同存储引擎的限制变得至关重要。本文将深入探讨InnoDB存储引擎的一系列限制,包括表、索引、表空间等方面的限制,帮助开发人员更好地理解和优化数据库设计。

1.mysql限制


1.1列数限制

MySQL规定,一个表最多可以包含1017个列。需要注意的是,虚拟生成列也计入这一限制。对于那些需要大量列的业务场景,开发人员应当注意这一限制,确保表结构的设计在合理范围内。
索引数限制

每个表最多可以包含64个辅助索引(secondary indexes)。辅助索引在数据库查询优化中起着重要作用,但限制了其数量有助于维持系统的高效性。
InnoDB的行格式和索引限制

InnoDB支持不同的行格式,包括DYNAMIC、COMPRESSED、REDUNDANT和COMPACT。这些行格式在索引键前缀长度方面有所不同。

对于使用DYNAMIC或COMPRESSED行格式的表,索引键前缀长度限制为3072字节。这为数据库设计提供了更大的灵活性,但也需要开发人员注意索引键长度的合理控制,以避免超出限制。

对于使用REDUNDANT或COMPACT行格式的表,索引键前缀长度限制为767字节。在这种情况下,开发人员需要更谨慎地选择索引和列前缀长度,以确保不会超出限制。
示例和注意事项

举例来说,如果在utf8mb4字符集下,使用了TEXT或VARCHAR列,并且尝试创建一个超过191字符的列前缀索引,就有可能超出限制,导致错误的发生。
**页大小对索引键前缀长度的影响

InnoDB的页大小也会影响索引键前缀长度的限制。通过在创建MySQL实例时指定innodb_page_size选项,可以将InnoDB页大小设置为8KB或4KB。在这种情况下,最大索引键长度将按比例降低,基于16KB页大小的3072字节限制。

    当页大小为8KB时,最大索引键长度为1536字节。
    当页大小为4KB时,最大索引键长度为768字节。

1.2对全列索引键的限制

值得注意的是,适用于索引键前缀的限制也同样适用于全列索引键。在设计数据库表时,开发人员应当综合考虑这些限制,以制定出最佳的数据库索引策略。
多列索引限制

对于多列索引,InnoDB表规定最多允许16个列。超出这个限制将导致错误的发生,系统会返回类似以下的错误信息:

ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed

1.3行大小限制

InnoDB表对行的大小也有一定的限制。虽然InnoDB内部支持大于65,535字节的行大小,但MySQL本身对行的大小设置了一个限制,不允许超过65,535字节。这一限制是对所有列大小的综合限制,开发人员应当在设计表结构时留意这个限制。
InnoDB log限制

对于InnoDB日志文件,其组合最大大小限制为512GB。


1.4表空间大小限制

InnoDB表的表空间大小也是有限制的,最小表空间大小略大于10MB。具体的最大表空间大小取决于InnoDB页大小,具体关系如下表所示:
InnoDB Page Size    最大表空间
4KB    16TB
8KB    32TB
16KB    64TB
32KB    128TB
64KB    256TB


1.5表数量限制

一个InnoDB实例支持最多2^32(4294967296)个表空间,其中一小部分表空间被保留用于撤销和临时表。

共享表空间支持最多2^32(4294967296)个表。
操作系统限制
文件大小和日志文件大小

在一些老旧的操作系统上,文件大小可能受到2GB的限制,但这并不是InnoDB的限制。如果需要更大的系统表空间,建议使用多个较小的数据文件,而不是一个大型数据文件,或者将表数据分布在以文件为单位的表空间数据文件中。
文件层级限制

表空间文件的路径,包括文件名,不能超过Windows上的MAX_PATH限制。在Windows 10之前,MAX_PATH限制为260个字符。截至Windows 10,版本1607,常见的Win32文件和目录函数不再受MAX_PATH限制,但您必须启用新的行为。

2.mysql中的char与varchar

char:定长,效率高,一般用于固定长度的表单提交数据存储  ;例如:身份证号,手机号,电话,密码等

varchar:不定长,效率偏低

2.1varchar类型的变化

MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,这样就能有效的减少数据库文 件的大小。

MySQL 数据库的varchar类型在4.1以下的版本中,nvarchar(存储的是Unicode数据类型的字符)不管是一个字符还是一个汉字,都存为2个字 节 ,一般用作中文或者其他语言输入,这样不容易乱码 ;varchar: 汉字是2个字节,其他字符存为1个字节 ,varchar适合输入英文和数字。

4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是 65532字节 ;varchar(20)在Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同,具体有以下规则:

 2.1.1存储限制

varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

2.1.2编码长度限制

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

2.1.3行长度限制

导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示

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。

2.2CHAR(M), VARCHAR(M)不同之处

CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检 索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义 char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用 的字符集确定。整体最大长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则 使用两个字节)。VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有 CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么”+1″呢?这一个字节用于保存实际使用了多大的长度。 从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录 字符串长度的字节(如果超过255则需要两个字节)。如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉 的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

2.3VARCHAR和TEXT、BlOB类型的区别

VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型 的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度 ,加上1个字节以记录字符串的长度。对于字符串’abcd’,L是4而存储要求是5个字节。

BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR需要定义大小,有65535字节的最大限制;TEXT则不需要。如果你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。

一个BLOB是一个能保存可变数量的数据的二进制的大对象。4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不同。

BLOB 可以储存图片,TEXT不行,TEXT只能储存纯文本文件。4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于 4个BLOB类型,并且有同样的最大长度和存储需求。在BLOB和TEXT类型之间的唯一差别是对BLOB值的排序和比较以大小写敏感方式执行,而对 TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB。

2.4char,varchar和text的区别

长度的区别,char范围是0~255,varchar最长是64k,但是注意这里的64k是整个row的长度,要考虑到其它的 column,还有如果存在not null的时候也会占用一位,对不同的字符集,有效长度还不一样,比如utf8的,最多21845,还要除去别的column,但是varchar在一般 情况下存储都够用了。如果遇到了大文本,考虑使用text,最大能到4G。

效率来说基本是char>varchar>text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替char。

char和varchar可以有默认值,text不能指定默认值。

数据库选择合适的数据类型存储还是很有必要的,对性能有一定影响。这里在零碎记录两笔,对于int类型的,如果不需要存取负值,最好加上unsigned;对于经常出现在where语句中的字段,考虑加索引,整形的尤其适合加索引。


感谢您的支持与关注,有技术问题私信大家一起探讨!!!

标签:存储,限制,字节,TEXT,varchar,索引,InnoDB,MySQL,长度
From: https://blog.csdn.net/jgb880811/article/details/136672359

相关文章

  • Java高频面试题---MySQL
    一、InnoDB和MyISAM有什么区别?InnoDB和MyISAM是MySQL中比较常用的两个执行引擎,MySQL在5.5之前版本默认存储引擎是MyISAM,5.5之后版本默认是InnoDB,MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用。它们主要有以下区别:1、InnoDB支持事务,MyISAM不......
  • gorm使用事务并发情况下切有最大mysql连接数限制的情况下的BUG,踩坑了
    现象服务器pprof中的goroutines很多,无法释放,肯定是异常.代码//收到请求上个赛季个人秘境赛季排行func(this*MsgProc)MsgProc_PersonSecretLastRankReq(msg*protoMsg.PersonSecretLastRankReq){ global.GetSrvInst().GetThreadGo().Go(func(ctxcontext.Context)......
  • Mysql学习
    1.5Mysql架构 1.6日志文件1)错误日志2)查询日志3)二进制文件记录了对mysql数据库执行的更改操作并且记录了语句发生的时间,执行时长;但是不记录select、showtables等不修改数据的SQL。主要用于数据库的恢复和主从复制4)慢查询日志超时查询日志,long_query  1.7数据文件......
  • 操作MySQL之mysql库
    目录一、快速使用1.下载2.快速链接3.最佳使用方案4.设置连接池二、查询数据1.单行查询db.QueryRow()2.多行查询db.Query()三、插入数据四、删除数据五、更新数据六、MySQL预处理1.什么是预处理?2.为什么要预处理?3.Go实现MySQL预处理4.SQL注入问题七、Go实现MySQL事务1.......
  • 操作MySQL之sqlx库
    目录一、介绍和使用1.安装和快速使用二、基本增删查改1.增加数据2.修改数据3.删除数据4.查询数据三、其他查询1.Get和Select查询四、其他方法1.sqlx的NamedExec2.sqlx的NamedQuery五、事务操作六、连接池一、介绍和使用上一篇我们用了go-sql-driver/mysql库来操作mysql......
  • MySQL 5.5和8.0.2 安装在一台电脑上
    情况说明:MySQL5.5已经安装,安装MySQL8方法一:InstallDirectory更改为C:\ProgramFiles\MySQLE\MySQLServer8.0;DataDirectory更改为C:\ProgramData\MySQLE\MySQLServer8(默认路径加E,也可以自定义)2.安装时更改端口号为3307、XProtocolPort为330703.添加环境变量path......
  • MYSQL 存储过程示例
    MySQL5.0版本开始支持存储过程。存储过程(StoredProcedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。存储过程思想上很......
  • MYSQL学习笔记26: 多表查询|子查询
    多表查询|子查询行子查询查询与张无忌工资相同,且直属领导相同的员工#写法1select*fromempwheresalary=(selectsalaryfromempwherename='张无忌')andmanagerId=(selectmanagerIdfromempwherename='张无忌');#可以合并起来,写入一个集合selec......
  • MySQL之运算符篇
    1.算术运算符算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加(+)、减(-)、乘(*)、除(/)和取模(%)运算。1.1 加法与减法运算符由运算结果可以得出如下结论:一个整数类型的值对整数进行加法和减法操作,结果还是一个整数;一个整数类型的值......
  • Mysql 100个表嵌套查询 存储过程
    背景1. 业务销售订单会随机落在1~100表中,查询一个订单时需要1到100表依次去查询,增加手工重复操作和浪费时间。2.查询未解冻数据时,需要过滤部分解冻的数据,此时需要用到嵌套查询。 一、根据订单号,循环1~100个表,查询出订单数据CREATEDEFINER=`{数据库连接账号}`@`%`......