2020-05-18 11:52:58
InnoDB索引的存储结构基于B-Tree数据结构,其核心设计围绕聚簇索引和二级索引展开,通过页(Page)管理数据存储,并通过主键选择策略优化查询效率。以下是具体分析:
一、InnoDB索引的基础数据结构InnoDB索引采用B-Tree(实际为B+Tree变种)作为底层数据结构,其特点包括:

聚簇索引是InnoDB表的核心存储结构,其特点如下:
若按主键顺序插入(如自增ID),当叶子节点容量达到15/16时,新记录写入新页,页填充率稳定在15/16。
若随机插入(如UUID),页填充率可能降至1/2至15/16之间,因需预留空间应对中间插入导致的页分裂。
用户显式定义主键时,直接使用该列作为聚簇索引。
未定义主键时,MySQL选择第一个唯一非空索引列作为主键。
无唯一索引时,InnoDB自动生成一个6字节的隐式ROWID作为主键,但此设计会导致性能下降(因二级索引需存储更大的ROWID)。
二级索引独立于聚簇索引存在,其特点包括:

页填充率控制:
顺序插入时,页填充率稳定在15/16,预留1/16空间应对未来插入。
随机插入时,页填充率动态调整,可能触发页分裂(Page Split),导致性能波动。
自增主键的优势:
顺序写入:自增主键保证数据按插入顺序连续存储,减少页分裂和碎片。
查询效率:顺序存储提升范围查询和索引覆盖扫描的性能。
二级索引优化:短自增主键减少二级索引的存储空间和回表开销。

UUID主键的缺陷:
随机插入:UUID导致数据分散存储,频繁触发页分裂,产生碎片。
性能下降:随机写入和回表操作增加I/O开销,降低查询效率。

InnoDB索引的存储结构以B-Tree为核心,通过聚簇索引和二级索引的分工实现高效数据检索。聚簇索引的顺序存储特性与自增主键的结合可最大化性能,而随机主键(如UUID)会导致存储碎片和查询效率下降。理解这些机制有助于优化数据库设计,提升整体性能。