MySQL 中如何计算一个索引的长度

Posted Think_Higher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 中如何计算一个索引的长度相关的知识,希望对你有一定的参考价值。

首先,我们要知道 mysql Innodb 引擎对于索引的长度是有限制的,最大为 767 字节。

你采用不同的字符编码方式,对应的字节数是不一样的,比如我们最常用的 utf8mb4 字符集是 4 字节字符集,则 767 字节 / 4 字节每字符 = 191字符(默认索引最大长度),所以在 varchar(255) 或 char(255) 类型字段上创建索引会失败,报错会提示最大索引长度为 767 字节。

其他的一些编码方式对应关系分别是:latin1 编码的,一个字符占用一个字节,gbk 编码的,一个字符占用两个字节,utf8 编码的,一个字符占用三个字节。

总的来说,索引长度计算规则为:

所有的索引字段,如果没有设置 Not Null,则需要加一个字节(这也是我们为什么建议建表时不要有 Null 字段的原因之一)。

对于定长字段,int 类型占四个字节、date 占三个字节、char(n) 占 N 个字符。

对于变成字段 varchar(n),则是 N 个字符 + 两个字节。

不同的字符集,一个字符占用的字节数不同。latin1编码的,一个字符占用一个字节,gbk编码的,一个字符占用两个字节,utf8编码的,一个字符占用三个字节。

索引长度 char()、varchar() 索引长度的计算公式:

Character Set:utf8mb4

如何规避 mySQL 中的最大密钥长度?

【中文标题】如何规避 mySQL 中的最大密钥长度?【英文标题】:how do I circumvent the max key length in mySQL? 【发布时间】:2012-06-03 19:57:30 【问题描述】:

我正在创建一个表,索引大量测量值,分布在各种文件中。在不同的表中,对于不同类型的数据,我使用数据文件的绝对路径作为唯一索引。这工作得很好。

但是,当我现在尝试在我的新表中重现该设置时,我得到了

mysql> alter table weights change column path path varchar(1000); ERROR 1071 (42000):指定的密钥太长;最大密钥长度为 767 字节

这很奇怪,因为我另一个表中的同一列被描述为:

| Field               | Type          | Null | Key | Default | Extra |
+---------------------+---------------+------+-----+---------+-------+
| path                | varchar(1000) | YES  | UNI | NULL    |       |

那么,我上次是如何绕过这个限制的呢?我应该告诉我自从创建第一个表以来我已经重新安装了 linux (& mySQL),所以很可能在我不知情的情况下更改了一些默认值。

当我启动 mySQL 时,欢迎信息是:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 128
Server version: 5.5.22-0ubuntu1 (Ubuntu)

当我搜索以前的答案时,一般的反应似乎是“嗯,就是这样”,但显然不是?

提前谢谢你:)

【问题讨论】:

这个问题的好答案可以在这里找到:***.com/questions/1814532/… 我想我完全不明白这些答案 【参考方案1】:

检查主键的定义 - 您可能在第一个表上使用了部分前缀键索引。

总体上更好的解决方案是使用文件路径的哈希作为主键并将文件路径本身存储在另一列中。

【讨论】:

什么是“文件路径哈希”? @Kaare - 类似于 MD5 或 SHA。 PHP 和 MySQL 都内置了散列函数。解释见这里:en.wikipedia.org/wiki/Hash_function

以上是关于MySQL 中如何计算一个索引的长度的主要内容,如果未能解决你的问题,请参考以下文章

mysql explain key_len是如何计算的?

mysql explain key_len是如何计算的?

mysql explain key_len是如何计算的?

MySQL InnoDB引擎索引长度受限怎么办

mysql varchar 字符串长度设定

mysql varchar 字符串长度设定