首页 > 数据库 > mysql教程 > 为什么我会收到 MySQL 错误'指定的键太长”?

为什么我会收到 MySQL 错误'指定的键太长”?

Susan Sarandon
发布: 2024-12-09 12:24:15
原创
174 人浏览过

Why Am I Getting the MySQL Error

MySql 错误:“指定的键太长”

在查询 MySql 数据库时,可能会出现“指定的键太长”错误创建具有长键长度的表时。在单个索引中使用多个列时经常会出现此问题。

pds_core_menu_items 表的案例研究

提供的查询尝试在列parent_menu_id、menu_link、plugin 和alias。这些列是 VARCHAR(255) 数据类型。

问题说明

正如 @Devart 提到的,这些列的组合长度超过了允许的最大键长度1000 字节。由于此限制,索引创建失败并出现指定错误。

解决方案:前缀索引

解决此问题的最佳实践是使用前缀索引。通过使用前缀索引,只对原始数据的左子串进行索引,大大减少了索引大小,提高了效率。

确定最佳前缀长度

确定每列的最佳前缀长度,执行以下查询:

SELECT
 ROUND(SUM(LENGTH(`column_name`)<10)*100/COUNT(`column_name`),2) AS pct_length_10,
 ROUND(SUM(LENGTH(`column_name`)<20)*100/COUNT(`column_name`),2) AS pct_length_20,
 ROUND(SUM(LENGTH(`column_name`)<50)*100/COUNT(`column_name`),2) AS pct_length_50,
 ROUND(SUM(LENGTH(`column_name`)<100)*100/COUNT(`column_name`),2) AS pct_length_100
FROM `table_name`;
登录后复制

将column_name替换为正在分析的列和 table_name 包含该列的表。分析输出以确定覆盖最高百分比行的最小子字符串长度。

更新的查询

在提供的示例中,索引 50 个字符的子字符串就足够了,如查询结果所示。以下是更新后的查询:

KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
登录后复制

附加说明

使用 INT(1) 和 INT(32) 数据类型时也可能会发生错误。虽然这些数据类型对存储大小或值范围没有影响,但如果使用 ZEROFILL 选项,它们可能会影响值的显示方式。

以上是为什么我会收到 MySQL 错误'指定的键太长”?的详细内容。更多信息请关注PHP中文网其他相关文章!

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