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