一 ,Mysql8.0的两个索引新特性

 1.1  支持降序索引

在之前我们默认索引是按升序排列的,但在8.0中我们可以指定以某个字段为关键字的索引为降序排列。比如下面创建索引

MySQL升序索引 mysql降序索引_字段

在5.7中,仍然是默认b为升序,而在8.0中,b已经变为降序

MySQL升序索引 mysql降序索引_sql_02

MySQL升序索引 mysql降序索引_联合索引_03

 降序索引只有在特定查询要求的情况下效率会更好,所以不要乱用

1.2隐藏索引

在5.7时我们要想不让优化器使用创建的索引,就只能把索引删掉,当我们又要用的时候又要手动创建索引,不仅麻烦,而且浪费系统资源。在8.0中提出了软删除的概念,我们可以设置某个索引为不可见(INVISIBLE),这样优化器在优化时就不会去考虑用这个索引,即使force index(强制使用)也不会使用它。

MySQL升序索引 mysql降序索引_字段_04

当然,你也可以设置隐藏索引对优化器可见(但是目前我不知道隐藏又可见是什么操作)

MySQL升序索引 mysql降序索引_联合索引_05

二 , 适合创建索引的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.计算,函数,类型转换导致索引失效

MySQL升序索引 mysql降序索引_字段_06

name是varchar类型

MySQL升序索引 mysql降序索引_sql_07

3.范围条件右边的索引列失效

4.!= 或 <> 会导致索引失效

5.is null 可以使用索引,is NOTNULL不能使用索引,后者不是精确查询

6.like以通配符"%"开头会导致索引失效

7.OR前后使用非索引的列会导致索引失效