一、varchar和char的区别

1.varchar的长度是可变的,char的长度是不可变的。
例:存储字符串’abcd’,使用char(10),表示存储的字符串占10个字节(包括6个空字符串)
使用varchar(10),表示只占用4个字节,10是最大值,当字符串小于10时,按实际字符串存储。
故而在获取数据时char()类型的数据需要使用trim()方法去掉字符串后面多余的空格。varchar()不需要。

2.存储时,char类型的数据比varchar类型的数据速度更快,因为其长度固定,方便存储、查找。故char类型的效率比varchar的效率稍高。
**
3.从存储空间角度讲,当插入的类型数据的长度固定时,有时候需要用空格进行占位存储时会占用更大的空间。varchar不会。char是以空间换取时间效率,而varchar是以空间效率为首。

4.char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据。

二、最左前缀匹配原则

最左前缀匹配原则:在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。
最左匹配原则:最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。
**
例:
圖片.png
先按name排序,name相同按照age排序,age相同则按照position排序,所以查找遵循最左前缀法则。

联合索引的最左原则:
例:student表字段:a 、b、c、d、e
a、b、c为联合索引
where a and b and c 有效
where a and c 有效
where a and b 有效
where b and c 无效
where c 无效

例:匹配最左列时
圖片.png
该索引遵循最左匹配原则,且使用的是联合索引中的(id)索引。

圖片.png
由于id到name是从左边依次往右边匹配,这两个字段中的值都是有序的,所以也遵循最左匹配原则。

圖片.png
不遵循联合索引的最左原则,type为All是对整个磁盘的数据进行全表扫描。