数据库建表键长度问题
今天从服务器将数据库的数据拷贝到本地,结果sql执行一直报错,总结一下遇到的几个问题:
- 
sql导入时报错,日志内容记录的片段不一定是有错的那一个语句
- 
感觉很奇怪,但是确实导入时发现那个日志的定位并不准确。
 - 
解决:主要是当时日志记录的错误语句我通过查询(控制台)单独执行,并没有报错
 - 
因此,在数据量相对还可以接受的时候想要准确的定位,还是通过控制台执行验证吧
 
 - 
 - 
这次导入我的主要报错信息为:
Specified key was too long; max key length is 767 bytes通过上网搜,说是在低版本(MySQL5.7 以下)有这个限制,但是之后的版本可以设置
innodb_large_prefix=ON来增加索引键前缀的限制到 3072 字节,且需要同时设置innodb_file_format=Barracuda和ROW_FORMAT=DYNAMIC或ROW_FORMAT=COMPRESSED。我想着设置呗,结果好家伙,系统中根本找不到该系统变量
又说是更高的版本中(我的是8.0.35)直接移除了该变量,默认就支持,我就蒙蔽了...这我还怎么排错啊
 
		好在,之前导入过很多次这个库的表结构,之前从没有遇到这个问题啊。于是我打开之前的备份文件进行逐一对比!欸之前的确实		没有问题,最后发现主要的问题在于ROW_FORMAT 这个参数,服务器上的tidb导出的值都是Compact,但是只有Dynamic才能正确导		入。
		于是我一键替换了所有的Compact => Dynamic,成功导入~
- 
问题解决了,但是这两个参数值到底有什么区别呢?
在 MySQL 中,
ROW_FORMAT是用来指定行存储格式的选项,它影响数据在表空间中的存储方式,进而影响表的存储效率和查询性能。InnoDB 存储引擎提供了几种不同的行格式,其中包括Compact、Dynamic、Redundant和Compressed。在 MySQL 5.7 及更高版本中,Compact和Dynamic是两种常用的行格式。以下是它们的主要区别:- 
Compact:
Compact行格式是为了向后兼容而保留的,它在存储行时会将变长字段的长度信息存储在行的末尾。- 这种格式适用于旧版本的 MySQL,但可能不是最高效的存储方式,因为它在存储变长字段时会占用额外的空间来存储长度信息。
 Compact行格式不支持行格式的动态转换,这意味着一旦表被创建为Compact格式,就不能动态转换为其他行格式。- 支持的最大索引键前缀长度为 
767字节。 
 - 
Dynamic(InnoDB默认):
Dynamic行格式是 MySQL 5.7 引入的,它提供了更灵活的存储方式,允许行中的每个列都有更多的存储空间,并且可以动态地调整。- 在 
Dynamic行格式中,变长字段的长度信息是存储在每个列的末尾的,这样可以减少存储长度信息所需的空间,从而提高存储效率。 Dynamic行格式支持更大的索引键前缀长度,如果启用了innodb_large_prefix选项,可以达到3072字节,而Compact行格式则限制在 767 字节。Dynamic行格式通常更适合存储大型数据行和使用大的索引键前缀,因为它可以更有效地利用空间。
 - 
REDUNDANT:
- 这是最早的 InnoDB 行格式,主要用于与旧版本的 MySQL 兼容。它存储更多的元数据,如额外的系统信息和字段长度信息,使得每行数据占用更多的空间。
REDUNDANT行格式支持的最大索引键前缀长度为767字节。 
 - 这是最早的 InnoDB 行格式,主要用于与旧版本的 MySQL 兼容。它存储更多的元数据,如额外的系统信息和字段长度信息,使得每行数据占用更多的空间。
 - 
COMPRESSED:
- 结合了 
DYNAMIC格式的特性,并引入了数据压缩功能,旨在进一步减少磁盘占用和提高 I/O 效率。这种格式特别适合磁盘空间较为昂贵或 I/O 速度较慢的环境。COMPRESSED行格式也支持索引键前缀长度为3072字节。 
 - 结合了 
 
 - 
 
至于内部具体的细节我就不深究了,这就涉及数据库底层原理了,到我学习完OB之后看看是否能够理解

                
            
        
浙公网安备 33010602011771号