在 MySQL 中,索引长度的限制取决于多个因素,包括 MySQL 版本、存储引擎、字符集以及行格式等。以下是对不同版本和存储引擎的最大索引长度的概述:
InnoDB 存储引擎
-
MySQL 5.7.6 及之前版本:
- 默认设置:单列索引最大长度为 767 字节。
- 启用
innodb_large_prefix
参数:单列索引最大长度可扩展至 3072 字节。
-
MySQL 5.7.7 及之后版本:
innodb_large_prefix
参数默认启用,单列索引最大长度为 3072 字节。
-
MySQL 8.0 及之后版本:
- 默认行格式为
DYNAMIC
或COMPRESSED
,单列索引最大长度为 3072 字节。 - 如果使用
REDUNDANT
或COMPACT
行格式,单列索引最大长度仍为 767 字节。
- 默认行格式为
MyISAM 存储引擎
-
所有版本:
- 单列索引最大长度为 1000 字节。
字符集对索引长度的影响
不同的字符集会影响索引的最大字符数,因为字符集决定了每个字符占用的字节数。以下是常见字符集的每字符最大字节数:
latin1
:1 字节/字符gbk
:2 字节/字符utf8
:3 字节/字符utf8mb4
:4 字节/字符
例如,在 utf8mb4
字符集下,单列索引最大字符数为:
- MySQL 5.7.6 及之前版本:191 个字符(191 × 4 = 764 字节)
- MySQL 5.7.7 及之后版本:768 个字符(768 × 4 = 3072 字节)
联合索引的长度限制
对于联合索引(多列索引),所有列的索引长度总和也受上述限制的约束。例如,在 InnoDB 引擎的 MySQL 5.7.6 及之前版本中,联合索引的总长度不应超过 3072 字节。
索引长度超限的影响
当尝试创建超出最大长度的索引时,可能会出现以下情况:
- 错误或警告:MySQL 可能会返回错误或警告,指示索引长度超出限制,导致索引创建失败。
- 前缀索引:对于超长的文本列,可以创建前缀索引,即仅索引列的前 N 个字符。例如,
CREATE INDEX idx_name ON table_name (column_name(255));
表示仅索引前 255 个字符。然而,前缀索引可能会降低索引的选择性,影响查询性能。
因此,在设计数据库索引时,应充分考虑上述限制,合理选择字符集和索引长度,以确保索引的有效性和查询性能。