跳转至

索引

索引分类

聚集索引与非聚集索引

以MySQL的InnoDB存储引擎为例,可以有如下解释:

每个索引上包含的字段会有不同,聚集索引包含所有字段,非聚集索引只包含索引字段+主键字段,所以如果在使用非聚集索引后还需要使用其他字段的(包括在where条件中或者select子句中),则需要通过主键索引回表到聚集索引获取其他字段。如果是非聚集索引可以满足SQL语句的所有字段的,则被称为全覆盖索引,没有回表开销。

回表是一个通过主键字段重新查询聚集索引的过程,所以如果在大量记录需要回表的情况下,查询成本会比直接在聚集索引上范围扫描的成本还大。所以对于一些情况,不使用非聚集索引效率反而更高。

InnoDB中主键索引是聚集索引,索引跟数据在一起的。其他索引是非聚集索引,索引指向的是主键索引

为什么要限定是InnoDB存储引擎呢?因为MyISAM存储引擎数据文件和索引文件是分离的,不存在聚集索引的概念。

资料