索引分为几个种类

聚合索引 非聚合索引 也可以称为主键索引和非主键索引

原理和区别是看叶子节点上保存的数据,主键索引保存的是完整数据,而非主键索引保存的是主键id。只用非主键索引查询相当于要查两次,这个操作叫做回表

另一种聚合索引 建议将常用的查询字段放在靠左的位置,因为查询原理是会先从最左开始查,然后匹配第一列,第二列,第三列。

如果有三列 a b c 设置为聚合索引,那么实际上会生成三种索引,分别是 a ab abc 

如果查询条件是 b bc ac 是用不到索引的。但如果是 ba是可以用到的 mysql是会自动更改顺序。

如果要避免回表的话 就是要用到覆盖索引,意思是 索引中要包含查询条件和查询出来的值的全部字段,比如我查询一个值,为 name 条件为age name需要创建索引 name age 就可以称为覆盖索引,这样就不需要进行回表。

至于索引失效的情况,包含各种符号 表达式,模糊查询的时候%写在前面,或者不写单引号导致类型转换。

使用函数,表达式,计算(加减乘除)。因为当前值改变后无法与索引存的值匹配

SELECT * FROM user_innodb where left(name, 3)='张三';-- left函数是一个字符串函数,它返回具有指定长度的字符串的左边部分
1

使用范围查询会导致右边列失效。因为二叉树的查找是=查找,若是一个范围的话无法继续下探

SELECT * FROM user_innodb where name='张三' and age > 22;
1

like以通配符开头,mysql索引失效会变成扫描操作。因为无法判断%代表多少字符。

SELECT * FROM user_innodb where name like '%三';
1

字符串不加’ '索引失效。因为会出现出现隐式转换,相当于给索引列做了操作

SELECT * FROM user_innodb where name = 007;-- "007"从字符串变成了数字007
1

少用or,用它连接时很多情况下索引会失效

SELECT * FROM user_innodb where name = '张 三' or name = '李四';
1
is null,is not null 无法使用索引.