天天看点

如何精确计算mysql的索引长度

一、前言

MySQL Innodb 对于索引长度的限制为 767 字节,并且UTF8mb4字符集是4字节字符集,则 767字节 / 4字节每字符 = 191字符(默认索引最大长度),所以在varchar(255)或char(255) 类型字段上创建索引会失败,提示最大索引长度为767字节。

二、环境准备

创建表

创建联合索引

三、试验

语句1的执行计划为:

如何精确计算mysql的索引长度

 语句2的执行计划为:

如何精确计算mysql的索引长度

查看表的索引

如何精确计算mysql的索引长度

将组合索引想成书的一级目录、二级目录、三级目录,如index(a,b,c),相当于a是一级目录,b是一级目录下的二级目录,c是二级目录下的三级目录。要使用某一目录,必须先使用其上级目录,除了一级目录除外。

所以

where a=1 and c=1只使用了一级目录,c在三级目录,没有使用二级目录,那么三级目录就没法使用

where a=1 and b=1只使用了一级目录、二级目录。

于是第二条查询的key_len更大。

但是,具体key_len怎么计算的,上面怎样计算出是4和8的呢?

SQL1

执行计划:

如何精确计算mysql的索引长度

key_len = 4 (a是int类型 4字节) = 4

所以得出结论,是命中了索引列a

SQL2

如何精确计算mysql的索引长度

key_len =4 (a是int类型 4字节) + 4(b是int类型 4字节)  = 8

所以得出结论,是命中了索引列a和索引列b

四、再实验

sql为:

 执行计划为:

 key_len =4 (id是int类型 4字节) + 5(name是varcharr类型 5字节)*1(字符集是latin1)+变列长2  = 11

知道、想到、做到、得到