innodb如何计算索引的密钥长度



我正试图为3列添加一个组合索引,但遇到一个错误,最大键长度为767字节,但我不知道它是如何计算的,以便将来能够理解。

Innodb版本:5.6

关于列的信息:

USER_ID bigint(20) utf8_general_ci
TYPE varchar(31) utf8_general_ci
REQ_NAME varchar(256) utf8_general_ci

ALTER TABLE my_table ADD INDEX IDX_USER_ID_TYPE_REQ_NAME (USER_ID, TYPE, REQ_NAME)max key length is 767 bytes失败

ALTER TABLE MODIFY column REQ_NAME VARCHAR(255)错误没有出现之后,它不会以varchar(255(失败,但我不明白为什么,如果255*3+31*3>有人能解释一下是怎么计算的吗?

767独立应用于每个列。组合的最大值是其他东西(可能大约8K??(

BIGINT -- 8 bytes
VARCHAR(n) utf8 (in 5.6) -- 2 (for length) + 3*n, with max of 767

Georg在varchar长度上漏掉了两个2。

默认值在5.7中进行了更改,从767更改为3072,从而允许使用utf8mb4。同时,关于767问题的五个解决方案,请参阅以下内容:http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes

utf8映射到ut8mb3,这意味着一个代码点将使用3个字节。bigint是一个64位整数(因此没有字符集(,长度为8字节。

8+(31+255(*3=866,这太大了,因为由于您的innodb_page_size设置,最大索引长度限制为768字节。

如果需要更大的索引,则必须更改全局服务器变量innodb_page_size。在您的服务器上,它当前为4KB,将其更改为8KB将允许最大1536字节的密钥大小,将其改为16KB将允许3072字节的最大密钥大小。

最新更新