索引:
索引就是一个数据结构,是数据库引擎为了查询快捷而建立的.
我的理解是:相当于一个图书馆,在没有编排类目之前,书是随机放置的,查找一本书,只能是遍历,一本本找,但是编排之后,会分为科学类,文学类,技术类等标签,这样找书就方便好多了,索引就相当于标签,用于快速查找。
索引结构:
考虑了范围查询,查询速度,正确率,节省内存等,mysql InnoDB大部分选用B+树做索引。
InnoDB和MyISAM的B+树索引实现不一样:InnoDB主索引根节点存的是主键,叶子节点存的data,而MyISAM存的是data的地址,数据存在另外的地方。
索引类型(以InnoDB为例):
最常见的就是:
1.聚簇索引,这个是每张表都必备的,首先会选这张表的主键座位聚簇索引,没有主键,会选第一个不重复的列,也没有的话,就会自己生成一个列座位聚簇索引。
2.普通索引,值可以不唯一,可以为null
3.唯一索引,值不可以重复,可以为null
4.组合索引(遵循最左前缀),几个字段一起组合起来作为索引。
等。。。。。
以上索引要是满足查询所需的列都在索引里面的话,就称为覆盖索引。覆盖索引的效率是最高的,因为查一次索引树就可以查到所要的数据了,避免回表操作。
索引失效:
失效情况有很多,like%,函数索引(mysql8.0之后支持),索引运算等。
以下举例来证明以下组合索引失效的情况,注意,有时候针对组合索引所说的失效,是指的部分失效,切记。
我现在有张表actor(id,name,lastname,firstname,sex),建了lastname,firstname,name作为组合索引(注意字段前后顺序,以下以abc作为代号代表lastname,firstname,name)
以下sql语句结合执行结果分析为:
1.explain select * from actor where lastname =‘ff’ and firstnam=‘ff’ and name=‘ff’
根据最左前缀原则,走abc索引
2.explain select * from actor where lastname =‘ff’ and firstnam=‘ff’
根据最左前缀原则,走ab索引
3.explain select * from actor where lastname =‘ff’
根据最左前缀原则,走a索引
4.explain select * from actor where lastname =‘ff’ and name=‘ff’
根据最左前缀原则,走a索引,a之后的索引不走
5.explain select * from actor where firstnam =‘ff’ and name=‘ff’
根据最左前缀原则,不走索引
6.explain select * from actor where firstnam =‘ff’
根据最左前缀原则,不走索引
7.explain select * from actor where name=‘ff’
根据最左前缀原则,不走索引
8.explain select * from actor where lastname=‘ff’ and firstnam like '%f%'and name=‘ff’
根据最左前缀原则,走a索引,like%会使组合索引内的这个字段索引失效,不走这个索引,之后的索引也自然失效
9.explain select * from actor where lastname=‘ff’ and firstnam =‘ff’ and name like ‘%f%’
根据最左前缀原则,走ab索引,like%会使组合索引内的这个字段索引失效,不走这个索引,之后的索引也自然失效
10.explain select * from actor where lastname >‘0’ and firstnam=‘ff’ and name=‘ff’
根据最左前缀原则,走a索引,">"比较符号会使组合索引内的这个字段以后的索引失效,这个字段的索引还是生效的
11.explain select * from actor where lastname like ‘%f%’ and firstnam =‘ff’ and name=‘ff’
根据最左前缀原则,不走索引,like%会使组合索引内的这个字段索引失效,不走这个索引,之后的索引也自然失效
12.explain select lastname from actor where lastname like ‘%f%’ and firstnam =‘ff’ and name=‘ff’
这个跟11不一样,虽然like%使组合索引内的这个字段及其之后的索引失效,但是由于查询所需要的列都在索引内,所以
会走覆盖索引,所以这句也是会走索引的。由此我个人总结出,like%不会使覆盖索引失效,个人意见,还请大家赐教。
以下是执行结果:
关于第12条的结果,大家有不同意见的,可以留言,切磋切磋。