以下是关于聚集索引、二级索引(非聚集索引)以及回表查询的重点内容:
聚集索引
- 定义与特点:聚集索引是将数据存储与索引放在一块儿,B树索引结构的叶子节点保存了整行数据,并且有且只能有一个,通常情况下是主键。
- 选举规则
- 若表中有主键,那么主键就是聚集索引。
- 若表没有主键,会查看是否有唯一索引,若有则将唯一索引当作聚集索引。
- 若表既没有主键也没有唯一索引,InnoDB引擎会自动生成一个隐藏的聚集索引。
二级索引(非聚集索引)
- 定义与特点:二级索引将数据与索引分开存储,B树索引结构的叶子节点关联的是对应的主键,一个表中可以有多个二级索引。
- 存储结构示例:以给表中的name字段添加索引为例,其在B树中叶子节点存储的是对应数据的主键值,而非整行数据,这与聚集索引存储整行数据不同。
回表查询
- 过程示例:
- 假设有查询语句
select * from user where name = 'arm'
,由于给name字段添加了索引, - 会先走二级索引。从根节点开始比对,
- 找到对应的节点(如找到arm对应的节点),但此时二级索引只能拿到主键值(如10),
- 因为查询语句是“select *”需要整行数据,所以要拿着主键值(10)再到聚集索引中查找。
- 在聚集索引中同样从根节点比对,最终定位到整行数据。
- 定义:先通过二级索引找到对应的主键值,然后拿到主键再到聚集索引中找到整行数据的过程就是回表查询。
面试回答技巧
- 当被问到“什么是聚集索引和非聚集索引”时,回答应包含聚集索引是数据与索引放一块,叶子节点存整行数据,一般是主键且只有一个;二级索引(非聚集索引)是数据与索引分开存,叶子节点存主键值,可以有多个,单独给字段创建的索引大多是二级索引。
- 当被问到“什么是回表查询”时,先介绍聚集索引和二级索引的概念,再解释回表查询是先通过二级索引找主键值,再用主键到聚集索引找整行数据的过程。实际面试中,即使面试官直接问回表查询,也应先介绍索引相关概念再解释回表查询。