1. MySQL索引基础与B+树原理
在数据库系统中,索引是提升查询效率的关键数据结构。MySQL作为最流行的关系型数据库之一,其索引实现基于B+树这一经典数据结构。理解B+树的工作原理对于深入掌握MySQL索引机制至关重要。
B+树是B树的变种,具有以下核心特征:
- 所有数据都存储在叶子节点,非叶子节点仅包含键值和指针
- 叶子节点通过指针相互连接形成有序链表
- 树的高度通常维持在3-4层,保证高效查找
B+树的这些特性使其特别适合数据库索引:
- 顺序访问优势:叶子节点的链表结构支持高效的范围查询
- 稳定的查询性能:所有查询都要走到叶子节点,时间复杂度稳定为O(log n)
- 高扇出特性:单个节点可以存储大量键值,减少树的高度
在MySQL中,不同存储引擎对B+树索引的实现存在显著差异,主要体现在数据存储方式上。这种差异直接影响查询性能、事务支持和并发控制等关键特性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. MyISAM存储引擎索引实现
2.1 MyISAM索引架构概述
MyISAM采用经典的"非聚集索引"设计,其核心特点是索引文件与数据文件物理分离。这种设计带来几个显著特征:
- 数据文件(.MYD)按记录插入顺序存储
- 索引文件(.MYI)独立存储B+树结构
- 主键索引与二级索引在结构上完全一致
这种分离设计的一个直观表现是:MyISAM表中记录的物理顺序与索引顺序无关,新插入的数据总是追加到数据文件末尾。
2.2 主键索引实现细节
MyISAM的主键索引B+树结构如下:
- 非叶子节点:存储索引键值和指向子节点的指针
- 叶子节点:存储索引键值和对应数据记录的物理地址(通常为文件偏移量)
以示例中的t_user表为例,其主键索引结构可以表示为:
code复制[B+树非叶子节点]
[10]
/ \
[5] [15]
(指针) (指针)
[B+树叶子节点]
[5]->0x1001 (数据文件地址)
[10]->0x1002
[15]->0x1003
当执行SELECT * FROM t_user WHERE id = 10时:
- 从根节点开始查找键值10
- 通过比较确定向右子节点查找
- 在叶子节点找到键值10对应的数据地址0x1002
- 根据地址0x
