MySQL内置的InnoDB的索引结构
InnoDB存储引擎采用 B+树作为索引的底层数据结构,主要分为聚簇索引和非聚簇索引两种。
B+树特点:
(1)平衡树结构:所有叶子节点位于同一层,查询时间复杂度稳定为O(logn);
(2)数据集中存储:所有数据都存储在叶子节点,非叶子节点仅存储键值和指针(仅针对聚簇索引)
(3):链表连接:叶子节点通过双向链表连接,支持高效的范围查询;
聚簇索引:
是InnoDB的核心索引结构,特征如下:
(1)存储结构:
叶子节点:存储完整的行数据(包括主键和其他所有字段)
非叶子节点:存储主键值和指向子节点的指针
物理存储:数据按主键顺序物理存储在磁盘上;
(2)创建规则:
如果表定义了主键,主键自动成为聚簇索引;如果没有主键,选择第一个非空的唯一索引作为聚簇索引;如果都没有,InnoDB会隐式创建一个6字节的rowid作为聚簇索引;
(3)查询优势:
主键查询:直接定位到叶子节点获取完整数据,无需额外IO操作;
范围查询:利用叶子节点的链表结构,可以高效遍历范围内的数据;
非聚簇索引:
也称二级索引,结构与聚簇索引类似,但存储内容不同
(1)存储结构
叶子节点:存储索引列的值和对应 的主键值
非叶子节点:存储索引列的值和指向子节点的指针
(2)回表查询机制:当使用二级索引查询时,若查询的字段不全在索引中,需要执行回表操作,在二级索引树中查找索引列的值,获取对应主键值,拿主键值到聚簇索引中查找完整的行数据,返回查询结果;
(3)覆盖索引优化:若查询的字段全部包含在二级索引中,包括主键,可以直接从二级索引获取数据,避免回表操作,提升查询性能;
索引查询流程:
聚簇索引查询:从根节点开始,通过二分查找定位到叶子节点,在叶子节点中找到对应的记录,直接返回完整的数据行;
二级索引查询:select * from table where name = 'alice',在name索引树中查找Alice获取对应主键值,拿主键值到聚簇索引中查找完整行数据(回表),返回数据;
性能优化建议
- 合理选择主键:优先使用自增整型主键,避免随机主键导致的页分裂
- 利用覆盖索引:设计索引时包含查询所需的所有字段,避免回表
- 控制索引数量:过多的索引会增加维护成本,影响写入性能
- 遵循最左前缀原则:联合索引的使用需要遵循列顺序
InnoDB的索引结构设计充分考虑了磁盘I/O效率、范围查询性能和并发处理能力,通过B+树的多路平衡特性和聚簇索引的数据组织方式,实现了高效的数据访问和管理
浙公网安备 33010602011771号