数据库的索引可以简单的分为四类:
-
主键索引。针对表的主键所创建的索引,这种索引是默认自动创建的,而且只能有一个。
-
唯一索引。避免表中某列的值重复,可以有多个唯一索引,在为某字段限定唯一约束时,会自动创建一个唯一索引。
-
常规索引。一般的用于快速定位检索数据的索引,可以有多个。
-
全文索引。查找的是文本中的关键词,用FULLTEXT关键字指定。
当然,上面的几类索引并不都是经常使用的。
在MySQL的InnoDB存储引擎中,根据索引的存储形式,又可以分为2类:
-
聚集索引。将数据和索引存储放到一起,索引结构的叶子节点保存行数据,因此聚集索引有且仅有一个。
-
二级索引。这种索引不与数据存储在一起,索引结构的叶子节点关联的是对应行数据的主键。
默认的情况下,主键索引就是聚集索引。实际上,存在没有主键的情况,聚集索引的选取规则如下:
-
有主键索引,则选择主键索引作为聚集索引。
-
没有主键索引,使用第一个唯一索引作为聚集索引。
-
如果没有主键索引或合适的唯一索引,InnoDB生成一个隐藏的rowid作为聚集索引。
通过这个规则保证聚集索引一定存在且唯一。
在根据二级索引对应的列进行查询时,不能直接通过主键上的聚集索引查询,需要首先通过字段对应的二级索引查找到对应行的主键id,再根据id回到聚集索引上查询到正确的行数据,因此需要进行两次索引查询(回表查询)。
如果二级索引与聚集索引一样,都直接把行数据存储到叶子节点上,数据会存储多份,造成空间的膨胀浪费。