从上面图可知 B+树的叶子节点存放了所有的索引值,并且叶子结点之间以链表的形式相互关联,所以我们只需从最左的链表遍历的话即可查找所有的值,最常见的用途就是范围查找,而 B 树则不满足这范围查找,又或者说实现特别复杂,所以 Mysql 最终选择了使用 B+树实现这一功能。
1.1 B-Tree 索引(B+树)
先说明一下,虽然叫在MySQL
官方叫做 B-Tree 索引,但采用的是 B+树数据结构。
B-tree 索引能够加快访问数据的速度,不需要进行全表扫描,而是从索引树的根节点层层往下搜索,在根节点存放了索引值和指向下一个节点的指针。
下面看下单列索引的数据怎么组织的。
create table User(
name
varchar(50) not null,uid
int(4) not null,gender
int(2) not null, key(uid
) );
上面 User 表给 uid 列创建了一个索引,那么往表里插入 uid(96~102)的时候存储引擎是怎么管理索引的呢?看下面的索引树
1.在叶子节点存放所有的索引值,非叶子节点值是为了更快定位包含目标值的叶子节点
2.叶子节点的值是有序的
3.叶子节点之间以链表形式关联
下面在看一下多列(联合)索引的数据怎么组织的。
create table User(
name
varchar(50) not null,uid
int(4) not null,gender
int(2) not null, key(uid
,name
) );
给 User 表创建了联合索引 key(uid
,name
) 这种情况下他的索引树是如下图所示。
特点跟单列索引一样,不同之处在于他的排序,如果第一个字段相同时会按第二个索引字段排序
如何通过 B-tree 快速查找数据?
对于 InnoDb 存储引擎的 B-tree 索引,会按