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