索引的分类
在索引开始篇中论述了索引的数据结构。这一次就仔细说说索引种类,和不同存储引擎导致的索引不同
MySQL索引有五种类型:通过给字段添加索引可以提高数据的读取速度,但是根据字段不同,添加的索引种类也是不同的
1、主键索引
–主键是一种唯一性索引,但它必须指定为PRIMARY KEY,每个表只能有一个主键。
2、唯一索引
–索引列的所有值只能出现一次,必须唯一,值可以为空。
3、普通索引
–基本的索引类型,值可以为空,但是没有唯一性的限制。(覆盖索引)
4、组合索引
–由多个列组成的索引,专门用于组合搜索(最左匹配原则)
5、全文索引
–MyISAM支持,innodb在5.6以后也支持全文索引(但是没人会在数据库中加全文索引)
–全文索引的索引类型为FULLTEXT。可以在varchar,char,text类型的列上创建
根据索引种类的不同,又引出了一些新奇的东西
覆盖索引(还没有研究到执行计划,不好截图进行讲解,只能用现在的理解进行解释,各位大佬看个乐呵就好)
覆盖索引常出现在普通索引中,比如创建一个表,里面有三个字段。id,name,age三个属性字段
给name字段设置普通索引后,当执行select * from sy where name = ‘lisi’;查询会先从name创建的索引表中查询到叶子节点中的主键,在根据查询到的主键再去主键创建的索引表中查到对应的数据返回。造成了回表,发生了俩倍的I/O读取。
若是查询结果只是查询name数据的id的话,select id from sy where name = ‘lisi’; 这样查询的时候索取的id,而从name索引表中获取到数据正是对应的主键值,不用再进行回表操作,中了就是覆盖索引。
最左匹配原则
依旧以sy这个表进行描述,最左匹配原则出现在组合索引当中。创建组合的顺序就变得很重要了,对name和age创建组合索引,当查询时where name=‘zs’ and age =15 根据最左匹配会先匹配name,再去匹配age。但是where条件中没有name只有age,那么就不会匹配age了,这就是最左匹配原则
索引下推
当对name和age进行条件查询的时候,查询name列肯定会造成回表,从数据中可以看到‘zs’ 相同的数据很多,回表会根据查询到的id进行逐个比较。但是!索引下推会减少比较。where name=‘zs’ and age = 20;会先根据name查询到对应id,还是会age进行比较,符合条件后才会去id的B+树中查询数据并返回。这就是索引下推。