创建桌子时,我遇到了一个有趣的问题。提示的是,从描述中,密钥太长了,无法超过指定的767字节限制。
以下是问题的表结构:
我们可以看到,为了姓名,我们设置了1000个变量字符的长度。因为它使用UTF8MB4编码,所以它的大小变为
因此,如果不修改其他配置,varchar的长度应为
有兴趣的学生可以对其进行测试,并指定名称大小为191、192,是否可以成功创建上表,后者的创建表失败。
解决方案
my.cnf配置
以上3072字节的原因如下
我们知道InnoDB页面的默认大小为16K。由于它是一个Btree组织,叶节点上的页面必须至少包含两个记录(否则链接列表将降级)。
因此记录不能超过8k。由于InnoDB的群集索引结构的b,第二级索引包含主键索引,因此每个单个索引不能超过4K(极端情况,PK,PK和某个第二级索引已达到此限制)。
由于需要保留空间和辅助空间,因此扣除后不能超过3500。取一个“整数”(1024*3)。
解决方案2
创建表时,添加
该参数的作用如下:
MySQL索引仅支持767个字节,每个字符UTF8MB4占4个字节,因此索引的最大长度只能是191个字符,即Varchar(191)。如果要使用较大的字段,则需要设置MySQL以支持支持DATA压缩,并修改表属性row_format = {dynamic |压缩}
资料来源:一个灰色博客