mysql key最大长度_mysql – #1071 – 指定的密钥太长;最大密钥长度为1000字节

正如@Devart所说,你的索引的总长度太长。

简单的答案是,你不应该索引这么长的VARCHAR列,因为索引会非常庞大​​和低效。

最佳做法是使用前缀索引,以便只索引数据的左子字符串。你的大部分数据将大大短于255个字符。

您可以在定义索引时声明每列的前缀长度。例如:

...

KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))

...

但是给定列的最佳前缀长度是多少?这里有一个方法来找出:

SELECT

ROUND(SUM(LENGTH(`menu_link`)<10)*100/COUNT(*),2) AS pct_length_10,

ROUND(SUM(LENGTH(`menu_link`)<20)*100/COUNT(*),2) AS pct_length_20,

ROUND(SUM(LENGTH(`menu_link`)<50)*100/COUNT(*),2) AS pct_length_50,

ROUND(SUM(LENGTH(`menu_link`)<100)*100/COUNT(*),2) AS pct_length_100

FROM `pds_core_menu_items`;

它告诉你在menu_link列中有不超过给定字符串长度的行的比例。您可能会看到如下输出:

+---------------+---------------+---------------+----------------+

| pct_length_10 | pct_length_20 | pct_length_50 | pct_length_100 |

+---------------+---------------+---------------+----------------+

| 21.78 | 80.20 | 100.00 | 100.00 |

+---------------+---------------+---------------+----------------+

这告诉你,80%的字符串少于20个字符,并且所有的字符串少于50个字符。因此,没有必要索引多于50的前缀长度,并且肯定不需要索引255个字符的全长。

PS:INT(1)和INT(32)数据类型表示对MySQL的另一种误解。 numeric参数与存储或列允许的值范围无关。 INT始终为4字节,并且始终允许值为-2147483648到2147483647.数字参数是关于显示期间的填充值,除非使用ZEROFILL选项,否则此操作无效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值