一、索引覆盖
如下图所示,索引有主键索引和其他索引(二级索引)。
如果二级索引上已经覆盖了查询所需的所有字段,那直接返回
二、回表查询
如果联合索引上没有覆盖查询所需的所有字段,那就需要通过联合索引上的主键(联合索引除了该联合索引的字段排序外,会额外有主键)到主键索引上去查找所有字段值,这个过程就是回表的磁盘I/O。下图使用name和department查询remark字段值时,需要用到回表查询,到主键索引上去查询到remark字段的值。
三、非聚簇索引
所以从聚簇索引和非聚簇索引层面来讲,二级索引也是非聚簇索引,需要到主键索引上查询其他数据。
此概念与myISAM的非聚簇索引类似,myISAM存储引擎,由于索引存储在MYI文件中,而数据存储在MYD文件中,所以通过索引查询结束后还需要到MYD文件中加载一次数据,所以是非聚簇索引。
四、聚簇索引
innodb的主键索引是聚簇索引(主键索引和数据存在一起,无需回表,通过主键索引查询出来以后就能获取到所有字段数据)
五、最左匹配原则
联合索引是按照索引字段的顺序,排序索引字段的值(name,age,position),先按照name排序,name有序的前提下再按照age排序,最后按照position排序,所以跳过第一列的排序都是无序的。
如:查询age=30的数据,在没有name的前提下,age是无序的,所以此时索引失效了