面试题答案
一键面试B+树索引结构特点
- 节点类型:
- 叶子节点:包含了所有的数据记录,并且叶子节点之间通过双向链表相连,便于范围查询。每个叶子节点存储多个键值对以及对应的数据行指针(实际数据可能存储在数据页中,指针指向对应数据页)。
- 非叶子节点:仅用于索引,存储键值和指向子节点的指针。其键值起到引导数据查询路径的作用,并不包含实际数据。
- 层级结构:
- 是一种多路平衡树,所有叶子节点都在同一层,保证了查询效率的稳定性。从根节点到叶子节点的每一条路径长度相同,这使得查找操作的时间复杂度稳定为O(log n),n为索引中记录的数量。
- 键值分布:
- 所有的键值都在叶子节点中出现,非叶子节点中的键值是叶子节点键值的副本,用于引导查询。叶子节点中的键值是按顺序排列的,这种有序性有利于范围查询和排序操作。
在分组查询(GROUP BY)场景下对查询性能的优化作用
- 排序优化:GROUP BY操作通常需要对数据进行排序。B+树索引的叶子节点按键值有序排列,当查询使用了与GROUP BY子句中字段相关的B+树索引时,MySQL可以利用索引的有序性,直接从索引中获取数据并按顺序读取,避免了额外的数据排序操作,从而提高查询性能。
- 快速定位:B+树的结构特点使得MySQL能够快速定位到满足条件的数据范围。在分组查询时,通过索引可以快速找到相关数据的起始位置,减少了全表扫描的开销。例如,对于查询
SELECT column1, COUNT(*) FROM table1 GROUP BY column1;
,如果column1
上有B+树索引,MySQL可以利用索引快速定位到不同column1
值的起始位置,然后直接从索引中统计每个分组的数量,而无需全表扫描。
常见利用B+树索引优化分组查询的场景
- 按单个字段分组:
- 场景:假设有一个
orders
表,记录了订单信息,其中有customer_id
字段。现在要统计每个客户的订单数量,即SELECT customer_id, COUNT(*) FROM orders GROUP BY customer_id;
- 优化:在
customer_id
字段上创建B+树索引,MySQL可以利用索引的有序性,快速定位并统计每个customer_id
对应的订单数量,避免全表扫描。
- 场景:假设有一个
- 按多个字段分组:
- 场景:对于
orders
表,除了customer_id
,还有order_date
字段。现在要统计每个客户在不同日期的订单数量,即SELECT customer_id, order_date, COUNT(*) FROM orders GROUP BY customer_id, order_date;
- 优化:在
(customer_id, order_date)
字段组合上创建联合B+树索引。索引会先按customer_id
排序,相同customer_id
下再按order_date
排序。这样在分组查询时,MySQL可以利用索引的有序性,快速定位并统计每个分组的订单数量,提升查询性能。
- 场景:对于