面试题答案
一键面试节点类型
- 叶子节点:
- 包含了所有的用户数据。数据以键值对的形式存储,键是索引列的值,值可以是对应行的其他列数据或者是指向实际数据行的指针(根据不同的存储引擎有所不同,如InnoDB存储引擎中,对于聚簇索引,叶子节点存储的是整行数据;对于二级索引,叶子节点存储的是索引列和主键值)。
- 叶子节点之间通过双向链表相连,这样可以方便地进行范围查询,按照键值顺序遍历链表即可获取范围内的数据。
- 非叶子节点:
- 只存储键值,不存储实际数据。其作用是引导查询,通过比较键值来决定搜索的方向,将查询请求导向合适的子节点。非叶子节点的键值数量比叶子节点少,以减少节点占用的空间,提高树的高度和查询效率。每个非叶子节点包含若干个键值和指向子节点的指针,指针数量比键值数量多一个。
数据存储位置
- 数据存储在叶子节点:在B+树索引中,实际的数据记录都存储在叶子节点。这使得在查询时,只要找到叶子节点,就能获取到对应的数据。例如,当执行一个基于索引列的精确查询时,从根节点开始,通过比较键值不断向下搜索,最终到达叶子节点获取数据。
- 聚簇索引与非聚簇索引:
- 聚簇索引:InnoDB存储引擎的聚簇索引叶子节点直接存储了整行数据。因为数据物理存储顺序与索引顺序一致,所以对于基于主键的查询非常高效。但由于数据物理存储依赖于聚簇索引,插入新数据时,可能需要移动大量数据来维护聚簇索引的顺序,特别是在数据页已满的情况下。
- 非聚簇索引(二级索引):叶子节点存储的是索引列和主键值。当通过二级索引查询时,先在二级索引的叶子节点找到主键值,然后再通过主键值在聚簇索引中查找完整的数据行,这种方式称为回表操作。所以基于二级索引的查询通常比基于聚簇索引的查询多一次I/O操作。