1。后台是新建mysql数据表的时候。不确定该表可以创建多少个字段和多少个索引。索引数量有限制吗?mysql数据是如何存储的,存储在哪里?2、基础号仅限MySQL5.6.9以后的版本。一个表的最大列数(包括虚拟列,这是MySQL5.7的新特性)是1017,在以前的版本中,一个表的最大列数是1000。数(非主键索引)是64。复合索引最多可以包含16列。超过则报错:ERROR1070(42000):Toomanykeypartsspecified;最多允许16个零件3。索引字段大小限制关于innodb_large_prefix配置的限制:showvariableslike'innodb_large_prefix';--在MySQL5.7.7之前,这个值默认为False,之后(包括5.7.7),这个值默认为TrueForRowFormatthatusesDYNAMICorCOMPRESSED,andinnodb_large_prefixisTrue,maximum所以限制大小字段前缀为3072字节(即字段的前3072字节会被索引)。如果此配置为false,则最大值为767bytes。如果索引字段的总长度超过这个限制,在创建或修改表时会报错。如果更改配置或行格式,最大限制将从3072字节更改为767字节。这个限制会对已经存在的表生效,但是已经存在的索引不会受到影响,只是无法创建。这个配置以后会失效,也就是说在以后的版本中,默认索引字段前缀的最大值是3072Bytes(不考虑RowFormat)4.innodb_page_size关于innodb_page_size数据库实例初始化配置:show像'innodb_page_size'这样的变量;--16384如果在创建数据库实例时修改innodb_page_size参数(默认16KB),字段前缀的限制大小为3072字节,也会发生变化。3072bytes对应16KBinnodb_page_size,1563bytes对应8KB,767对应4KB。Innodb_page_size是初始化数据库实例的参数。在当前版本(>=5.7.6)中,可以选择的值为4096、8192、16384、32768、65536。默认为16KB,尺寸越小,内存分区粒度越大,越高使用率,但是还会有其他问题,就是索引字段和整行的大小是有限制的。innodb引擎读取内存,更新是逐页更新。这个innodb_page_size决定了一个基本页面的大小。常用的B+Tree索引,B+树是一种为磁盘等存储辅助设备设计的平衡搜索树(不是二叉树)。在B+树中,所有记录的节点按大小顺序存放在同一层的叶子节点中,每个叶子节点之间通过指针连接。MySQL将每个叶子节点的大小设置为一页的整数倍,并利用磁盘预读机制有效减少磁盘I/O次数,提高查询效率。如果一行数据超过一页的一半,那么一页只能容纳一条记录,这样B+Tree在不利的情况下就变成了双向链表。这就是为什么需要限制每一行的大小,也就是下面要说的行长和行大小限制。,VARCHAR,BLOB和TEXT),定长字段占用空间的大小),这个行长度至少是一行数据必须占用的长度。上一节提到这个长度不要超过innodb_page_size的一半。对于LONGBLOB和LONGTEXT字段,长度不能超过4GB,包括所有字段的总长度,不能超过4GB。InnoDB表数据行(本地存储在数据库页面上的数据)的最大大小略小于innodb_page_size的一半(4KB、8KB、16KB和32KB)。例如,使用默认的16KB页面大小配置,数据行的最大大小刚好低于8KB。对于64KB数据页,最大数据行大小略小于16KB。如果一行中的变长字段超过InnoDB数据行大小限制,InnoDB会使用页外存储来保存部分变长字段,直到数据行能够满足InnoDB数据行大小限制。对于页外存储的变长字段,本地存储的数据内容取决于数据行的格式。详见《InnoDB数据行格式》。Longsize(RowSize,这个是MySQL的限制,不是InnoDB)的限制。InnoDB虽然支持不超过4GB的长度,但是MySQL将所有列(不包括TEXT和BLOB,因为它们不与数据记录存储在一起)默认占用的空间不超过65535。不同的存储引擎使用不同的页眉和页尾数据,这会影响数据行实际可用的存储空间。示例过程:CREATETABLEt(aVARCHAR(10000),bVARCHAR(10000),cVARCHAR(10000),dVARCHAR(10000),eVARCHAR(10000),fVARCHAR(10000),gVARCHAR(6000))ENGINE=InnoDB字符集latin1;错误1118(42000):行大小太大。usedtable类型的最大行大小(不包括BLOB)为65535。这包括存储开销,请查看手册。你必须将一些列更改为TEXT或BLOBsInnoDB表才能创建成功,因为将字段更改为TEXT可以避免超过65535字节的限制,InnoDBoff-page存储可以避免超过InnoDB数据行大小的限制。创建表t(aVARCHAR(10000),bVARCHAR(10000),cVARCHAR(10000),dVARCHAR(10000),eVARCHAR(10000),fVARCHAR(10000),gTEXT(6000))ENGINE=InnoDBCHARACTERSETlatin1;QueryOK,0rowsaffected(0.02sec)变长字段的存储包含了长度信息,这个内容也会计算到数据行大小中。例如,一个VARCHAR(255)CHARACTERSETutf8mb3字段需要2个字节来存储数据的长度,因此每个值最多可能占用767个字节。以下语句可以成功创建表t1,因为它的字段需要32765+2字节加上32766+2字节,满足65535字节的限制:CREATETABLEt1(c1VARCHAR(32765)NOTNULL,c2VARCHAR(32766)NOTNULL)ENGINE=InnoDBCHARACTERSETlatin1;QueryOK,0rowsaffected(0.02sec)以下语句创建表t2失败,因为虽然字段长度没有超过65535字节的限制,但是增加了2字节的记录长度之后,超出了限制。改成65535后就成功了。CREATETABLEt2(c1VARCHAR(65535)NOTNULL)ENGINE=InnoDBCHARACTERSETlatin1;[Err]1118-行大小太大。使用的表类型的最大行大小(不包括BLOB)为65535。这包括存储开销,请查看手册。您必须将某些列更改为TEXT或BLOBsCREATETABLEt2(c1VARCHAR(65533)NOTNULL)ENGINE=InnoDBCHARACTERSETlatin1;QueryOK,0rowsaffected(0.01sec)InnoDBlimitstherowsize(localdatastoredinadatabase页)略小于数据库页的一半。以下语句失败,因为总字段长度超过InnoDB页面的数据行大小限制16KB。创建表t4(c1CHAR(255),c2CHAR(255),c3CHAR(255),c4CHAR(255),c5CHAR(255),c6CHAR(255),c7CHAR(255),c8CHAR(255),c9CHAR(255),c10CHAR(255),c11CHAR(255),c12CHAR(255),c13CHAR(255),c14CHAR(255),c15CHAR(255),c16CHAR(255),c17CHAR(255),c18CHAR(255),c19CHAR(255),c20CHAR(255),c21CHAR(255),c22CHAR(255),c23CHAR(255),c24CHAR(255),c25CHAR(255),c26CHAR(255),c27CHAR(255),c28CHAR(255),c29CHAR(255),c30CHAR(255),c31CHAR(255),c32CHAR(255),c33CHAR(255)))ENGINE=InnoDBROW_FORMAT=DYNAMICDEFAULTCHARSETlatin1;错误1118(42000):行大小太大(>8126)。ChangingsomecolumnstoTEXTorBLOBmayhelp.Incurrentrowformat,BLOBprefixof0bytesisstoredinline.官方给出的解决方法:优化表结构。变长字段设置是否合理。如果变长字段太长,建议改为blob或text垂直表字段拆分或大字段合并(大字段最大不超过768个,业务合并+拆分),把你的桌子分成小桌子。如果一个表包含10多个文本列,并且包含的??数据有点长。这种格式对blob字段的处理方式是在page中只存放一个20byte的指针,其他都有溢出区,所以不会轻易超过8K。修改row_format为COMPRESSED或者DYNAMIC,当然前提是要保证innodb_file_format=Barracuda如何修改方法:1.修改mysql配置文件my.cnfinnodb_file_per_tableinnodb_file_format=Barracuda2.修改导致这个问题的表属性ALTERTABLE$TABLEENGINE=InnoDBROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE=8;3、重启mysql服务4、通过写sql语句修改mysql环境配置,可以不用重启服务。当然,以上两个参数也必须在配置文件中进行配置。这个操作只是为了避免重启mysql服务setglobalinnodb_file_per_table=ON;设置全局innodb_file_format=barracuda;6.文件大小限制InnoDB的所有日志文件不能超过512GBtable最小空间(tableSpace)略大于10MB,最大由innodb_page_size决定:InnoDBPageSizeMaximumTablespaceSize4KB16TB8KB32TB16KB64TB32KB128TB64KB256TB参考:https://dev.mysql.com/doc/ref...https://dev.mysql.com/doc/ref...https://www.cnblogs.com/zhiqi...本文由多篇博文平台OpenWrite发布!
