Mysql Varchar 类型为什么默认设置 255?

Mysql Varchar 类型为什么默认设置 255 ?

Mysql5.6.x

Mysql5.6 版本下,单列索引的长度不能超过 767bytes,联合索引的长度不能超过 3072bytes

Mysql5.7.x

Mysql5.7 版本下,单列索引的长度不能超过 3072bytes,联合索引的长度不能超过 3072bytes

utf8

上面说到单列索引长度为 767,在 utf8 编码下,一个字符为 3bytes,那么 255*3=765,刚好为能够建立索引长度的最大值,如果超出了这个值,如果使用的是 navicat 那么 mysql 会自动将这一列的索引变为前缀索引,截取 255

utf8mb4

在 utf8mb4 下,一个字符为 4bytes, 那么 767÷4=191.75,取整为 191,所以在 utf8mb4 编码下,如果你的 varchar 超出 191,如果使用的是 navicat 那么 mysql 会自动将这一列的索引变为前缀索引,截取 191

为什么联合索引长度是 3072

我们知道 InnoDB 一个 page 的默认大小是 16k。由于是 Btree 组织,要求叶子节点上一个 page 至少要包含两条记录(否则就退化链表了)。

所以一个记录最多不能超过 8k。

又由于 InnoDB 的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过 4k (极端情况,pk 和某个二级索引都达到这个限制)。

由于需要预留和辅助空间,扣掉后不能超过 3500,取个 整数 就是 1024*3=3072

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值