这是我参与8月更文挑战的第 12 天,活动详情查看:8月更文挑战
作者简介:悟空,8年一线互联网开发和架构经验,用故事讲解分布式、架构设计、Java 核心技术。《JVM性能优化实战》专栏作者,开源了《Spring Cloud 实战 PassJava》项目,公众号:
悟空聊架构。本文已收录至 www.passjava.cn
大家好,我是悟空哥,今天给大家带来的是大厂面试题:
问题:说下 MySQL 聚集索引和非聚集索引?
面试者小空听到这题后,窃喜,这题简单,不假思索地回答:内部都是 B+ 树结构。
面试官面无表情的说道:还有吗?
小空支支吾吾的没有答上来。
InnoDB 存储引擎支持以下几种常见的索引: B+树索引、全文索引、哈希索引 而 B+树索引最为常见,可以分为聚集索引和非聚集索引。非聚集索引也可以叫做辅助索引,二级索引。
两种索引相同点: 内部都是 B+ 树,高度平衡,叶子节点存放着所有的数据。
不同点: 聚集索引的叶子节点存放是一整行的信息。 聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。 聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。 聚集索引查询数据速度快,插入数据速度慢;非聚集索引反之。 聚集索引范围查询快。
聚集索引: InnoDB 存储引擎表是索引组织表,表种数据按照主键顺序存放,而聚集索引就是按照每张表的主键构造一颗 B+ 数,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。 每张表只能拥有一个聚集索引。 查询优化器倾向于采用聚集索引。
非聚集索引: 叶子节点不包含记录的全部数据。 叶子节点中索引行中还包含了一个书签,用来告诉 InnoDB 存储引擎在哪里可以找到与索引相应的行数据。 这个书签就是相应的行数据的聚集索引键。 可以有多个非聚集索引。 使用非聚集索引来寻找数据时,通过叶级别的指针获得指向主键索引的主键,再通过主键索引找到一个完整的行记录。
小空听完后,叹了一口气,今天又是被面试官吊打的一天。
下个问题:
问题1:那非聚集索引这种查询方式算不算回表呢? 问题2:联合索引、索引覆盖、普通索引、唯一索引 和上面两种索引有什么关系?