首页 > 数据库 > mysql教程 > 为什么 MySQL 的 varchar 索引长度限制在不同版本之间有所不同?

为什么 MySQL 的 varchar 索引长度限制在不同版本之间有所不同?

Susan Sarandon
发布: 2024-11-22 00:44:14
原创
615 人浏览过

Why Does MySQL's varchar Index Length Limit Differ Between Versions?

MySQL varchar 索引长度

在探索 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板