MySQL各版本支持的索引最大长度

5 阅读2分钟

在 MySQL 中,索引长度的限制取决于多个因素,包括 MySQL 版本、存储引擎、字符集以及行格式等。以下是对不同版本和存储引擎的最大索引长度的概述:

InnoDB 存储引擎

  • MySQL 5.7.6 及之前版本

    • 默认设置:单列索引最大长度为 767 字节。
    • 启用 innodb_large_prefix 参数:单列索引最大长度可扩展至 3072 字节。
  • MySQL 5.7.7 及之后版本

    • innodb_large_prefix 参数默认启用,单列索引最大长度为 3072 字节。
  • MySQL 8.0 及之后版本

    • 默认行格式为 DYNAMICCOMPRESSED,单列索引最大长度为 3072 字节。
    • 如果使用 REDUNDANTCOMPACT 行格式,单列索引最大长度仍为 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 字节。

索引长度超限的影响

当尝试创建超出最大长度的索引时,可能会出现以下情况:

  1. 错误或警告:MySQL 可能会返回错误或警告,指示索引长度超出限制,导致索引创建失败。
  2. 前缀索引:对于超长的文本列,可以创建前缀索引,即仅索引列的前 N 个字符。例如,CREATE INDEX idx_name ON table_name (column_name(255)); 表示仅索引前 255 个字符。然而,前缀索引可能会降低索引的选择性,影响查询性能。

因此,在设计数据库索引时,应充分考虑上述限制,合理选择字符集和索引长度,以确保索引的有效性和查询性能。