在探索 SQL 查询性能问题时,用户尝试通过向 products.name 列添加索引来优化查询,该索引为定义为 varchar(512)。指定为product_name_idx (name(512)) 的原始索引导致索引不用于排序,因为它被识别为前缀索引。
为了解决此问题,用户尝试截断名称列到 varchar(255)。进行此更改后,后续的 EXPLAIN 语句表明正在使用索引。
此行为源于 MySQL 对 UTF-8 字符长度的假设。在 MySQL 中,单个列的最大索引大小为 767 字节。在 MySQL 8.0 之前,utf8 字符集被限制为每个字符最多 3 个字节。然而,在 MySQL 8.0 中,这种情况发生了变化,utf8mb3 现已被弃用,并被 utf8mb4 取代,它支持每个字符最多 4 个字节。
在 8.0 之前的 MySQL 版本中,指定大于默认值的索引长度varchar(255) 列的 255 个字符将导致错误。这是因为 MySQL 假设 UTF-8 每个字符 3 个字节,而 256 个字符的索引将超出 767 个字节的限制。
使用 MySQL 8.0 和 utf8mb4 字符集,每个字符 3 个字节的假设仍然适用。然而,随着压缩和动态行格式的引入,索引键前缀可以达到 3072 字节。因此,可以在字符数较多的 varchar 列上创建索引。
总而言之,在早期的 MySQL 版本中,由于假设每个 3 个字节,varchar 列的索引长度限制为 255 个字符。 UTF-8 字符和 767 字节最大索引大小。在 MySQL 8.0 和 utf8mb4 中,对于压缩和动态行格式,这一限制已经放宽,允许 varchar 列上有更长的索引。
以上是为什么 MySQL 的 varchar 索引长度限制在不同版本之间有所不同?的详细内容。更多信息请关注PHP中文网其他相关文章!