B+树索引
聚集索引
聚集索引是通过将表的主键作为键值来构造B+树。聚集索引不仅包含索引的键值,还包含记录其他所有列的信息。聚集索引中的记录是根据键值顺序存放的。聚集索引的非叶节点存放的是<键值,索引>对。地址为指向下一层的指针,存储引擎通过页在表空间中的偏移量来表示。
辅助索引
辅助索引又称为二级索引或非聚集索引。辅助索引的叶子节点并不保存记录中的所有列,其叶子节点保存的是< 键值,(记录)地址>。记录的地址一般可以存在以下两种形式。
1.记录的物理地址,页号:槽号:偏移量
2.记录的主键值。
第一种方式是MyISAM存储引擎B+树的存储方式,并且在MyISAM存储引擎表中就没有聚集索引。王菀之的记录并不存放在B+树索引中,而是存放在堆表中。在这种实现方式下,主键与其他索引的区别仅在于该索引是否是唯一的并且是非空的。
InnoDB存储引擎是索引组织表,所有记录都存放在聚集索引中。因此其辅助索引中记录地址存放的是主键的键值。
不同辅助索引实现的对比如下表:
对于InnoDB存储引擎而言,由于辅助索引叶子节点中记录地址存放的是主键,因此当要查询完整记录时还需要通过一次聚集索引查询,一般称这种查询方式为书签查找。辅助索引的非叶子结点存放的记录格式为< 键值,主键值,地址>。辅助索引节点的记录不保存隐藏列xid和roll ptr,这时辅助索引和聚集索引不相同的又一个方面。