在MySQL默认引擎InnoDB中,索引大致可以分为两类:聚集索引和非聚集索引。它们之间的区别也是常见的面试题,所以今天就来讨论一下。聚集索引聚集索引(ClusteredIndex)一般是指主键索引(如果有主键索引),聚集索引也称为聚簇索引。InnoDB中使用B+树实现聚簇索引。比如我们创建一张student表,它的构造SQL是这样的:droptableifexistsstudent;createtablestudent(idintprimarykey,namevarchar(16),class_idintnotnull,index(class_id))engine=InnoDB;--添加测试数据insertintostudent(id,name,class_id)values(1,'Zhang散',100),(2,'李四',200),(3,'王五',300);上面的student表中有一个聚集索引(也就是主键索引)id和一个非聚集索引class_id。聚簇索引id对应的B+树如下图所示:用户信息的内存地址直接存放在聚簇索引的叶子节点中,我们可以直接通过内存地址找到对应的行数据。非聚集索引非聚集索引在InnoDB引擎中也称为二级索引。以上面的student表为例,student中非聚集索引class_id对应的B+树如下图所示:-聚簇索引并不是真正的行数据,而是主键ID,所以我们在使用非聚簇索引查询的时候,会先得到一个主键ID,然后用主键ID聚簇找到真正的行索引上的数据,我们把这个过程称为回表查询。综上所述,在MySQL的InnoDB引擎中,每一个索引对应一棵B+树,聚集索引和非聚集索引最大的区别就是叶子节点存储的数据不同。聚簇索引的叶子节点存储行数据,所以可以直接通过聚簇索引找到真正的行数据;非聚集索引的叶子节点存放的是主键信息,所以使用非聚集索引也需要回表查询,所以我们可以得到聚集索引和非聚集索引主要区别如下:聚集索引的叶子节点存放行数据;非聚集索引的叶子节点存储聚集索引(通常是主键ID)。聚簇索引查询效率更高,而非聚簇索引需要回表查询,所以性能不如聚簇索引。聚簇索引一般是主键索引,一张表中只能有一个主键,所以一张表中只能有一个聚簇索引,非聚簇索引的个数没有限制。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview
