一 ,Mysql8.0的两个索引新特性
1.1 支持降序索引
在之前我们默认索引是按升序排列的,但在8.0中我们可以指定以某个字段为关键字的索引为降序排列。比如下面创建索引
在5.7中,仍然是默认b为升序,而在8.0中,b已经变为降序
降序索引只有在特定查询要求的情况下效率会更好,所以不要乱用
1.2隐藏索引
在5.7时我们要想不让优化器使用创建的索引,就只能把索引删掉,当我们又要用的时候又要手动创建索引,不仅麻烦,而且浪费系统资源。在8.0中提出了软删除的概念,我们可以设置某个索引为不可见(INVISIBLE),这样优化器在优化时就不会去考虑用这个索引,即使force index(强制使用)也不会使用它。
当然,你也可以设置隐藏索引对优化器可见(但是目前我不知道隐藏又可见是什么操作)
二 , 适合创建索引的10种情况
1.具有唯一性约束的字段。创建具有唯一性约束的字段时也会自动创建该字段的索引。
2.频繁作为where查询条件的字段
3.经常被当做group by 或 order by条件的字段
4.被DISTINCT修饰的字段
5.在多表连接时,对用于连接的字段创建索引。
6.尽量使用字段类型占空间小的字段创建索引,因为页空间有限,在页数比较庞大时,能够缩小一点因为类型导致的空间都是不小的优化。
7.使用字符串前缀创建索引。在阿里巴巴的Java开发手册中明确指出,在堆Varchar字段创建索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度。
8.区分度高的字段适合创建索引
9.使用最频繁的列适合放在联合索引的左边,(最左前缀原则),可以增加联合索引的命中率
10,在多个字段都要创建索引的情况下,联合索引优于单列索引
三,不适合创建索引的5种情况
1.不作为where条件的字段不要创建索引
2.在数据量小的情况下,不要创建索引
3.在有大量重复数据的列,不要创建索引,比如性别
4.避免对经常更新的表创建过多的索引,因为更新很可能导致索引也要更新,消耗系统资源
5.避免对无序的字段创建索引
四,索引失效
1.查询字段需满足最左前缀原则,如果条件中的字段顺序和联合索引的关键字顺序不同,例如索引是(a,b,c),查询的是(b,a,c),那么这次查询就不能使用这个索引
2.计算,函数,类型转换导致索引失效
name是varchar类型
3.范围条件右边的索引列失效
4.!= 或 <> 会导致索引失效
5.is null 可以使用索引,is NOTNULL不能使用索引,后者不是精确查询
6.like以通配符"%"开头会导致索引失效
7.OR前后使用非索引的列会导致索引失效