一、前言
MySQL Innodb 对于索引长度的限制为 767 字节,并且UTF8mb4字符集是4字节字符集,则 767字节 / 4字节每字符 = 191字符(默认索引最大长度),所以在varchar(255)或char(255) 类型字段上创建索引会失败,提示最大索引长度为767字节。
二、环境准备
创建表
创建联合索引
三、试验
语句1的执行计划为:

语句2的执行计划为:
查看表的索引
将组合索引想成书的一级目录、二级目录、三级目录,如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
执行计划:

key_len = 4 (a是int类型 4字节) = 4
所以得出结论,是命中了索引列a
SQL2
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
知道、想到、做到、得到