innerDB 引擎的 B+ 树底层本质是一个有序链表,根据主键排序,没有设置主键的会在内部生成一个默认主键,并且引入了页或者segment概念,每个segment内建跳表(页目录)加快链表的索引,并且在segment外加跳表,同样加快segment的定位。
所以根据主键查询的流程大概如下,先根据segment的跳表定位到是哪个segment,然后根据segment内部的跳表定位到具体的那条数据。
把跳表的合并就变成了B+树,可能是索引和存储性能更好的原因(磁盘4k一读,mysql 16k 一读),本质其实就是通过跳表加快链表的索引速度。
聚簇索引指的是根据主键建立起来的B+树,可以直接查到具体的数据,因为是根据主键排序的,所以要想通过索引找到数据,只能通过主键,不通过主键的话,存储的数据相当于是乱序的,只能所有数据遍历一遍。
其他字段的索引是根据这些字段(非主键)排序建立的B+树,但是叶子节点都是主键,所以根据 非聚簇索 引先找到主键,再拿着主键通过 聚簇索引 才能找到数据。
假设有一个联合索引,字段为a,b,c,在建立索引树时,先根据a排序,再根据b,最后根据c,所以如果一条sql没有a,就无法使用这个索引,因为它首先是根据a排序的。(其实多字段在一棵树上怎么排序,我也没想明白具体是怎么排的)