文
章
目
录
章
目
录
Java面试题:说下聚簇索引和非聚簇索引的区别
得分点:
索引即数据、二次查询
标准回答:
聚簇索引和非聚簇索引之间的主要区别在于数据和索引是否分离。在数据库中,通常有两种类型的索引:聚簇索引和非聚簇索引。
- 聚簇索引:聚簇索引将数据与索引存储在一起。这意味着找到索引也就找到了相应的数据。在InnoDB存储引擎中,每个表只能有一个聚簇索引,通常是建立在主键上的。即使没有明确指定主键,InnoDB也会生成一个聚簇索引。因此,聚簇索引中存储了整个数据行。
- 非聚簇索引:非聚簇索引将数据和索引存储分离开。索引树的叶子节点存储了数据行的地址,而不是数据本身。当使用非聚簇索引来访问索引外的其他字段时,需要进行二次查找,也就是从索引中找到数据的地址,然后再根据地址去检索实际的数据。
在MyISAM存储引擎中,所有索引都属于非聚簇索引,叶子节点存储着数据的地址。对于主键索引和普通索引,在存储方式上没有区别。
加分回答:
在InnoDB存储引擎中,B+树索引可以分为聚簇索引和辅助索引(非聚簇索引)。无论是哪种类型的索引,每个页的大小都为16KB,且不可更改。
聚簇索引是根据主键创建的一棵B+树,聚簇索引的叶子节点存放了表中的所有记录。辅助索引则是根据索引键创建的B+树,其叶子节点仅存放索引键值以及该索引键值所指向的主键。这意味着,通过辅助索引查找数据时,通常还需要根据主键值查找聚簇索引以获取实际的数据,这个过程被称为书签查找。
辅助索引不包含行记录的所有数据,因此每页可以存放更多的键值,导致其树的高度通常较低。这也意味着辅助索引的查询性能可能比聚簇索引更高效,但在获取完整数据时需要进行额外的查找步骤。