mysql复合索引btree结构_mysql - index 索引 之 索引结构(B+tree)

概述:

索引是在mysql的存储引擎层中实现的,不是在服务层。

故,每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型。

mysql目前,提供了一下4中索引:

BTREE索引: 最常见的索引类型,大部分索引都支持B树索引;

HASH索引:   只有Memory引擎支持,使用场景简单;

R-tree索引:   空间索引是MyISAM引擎的一个特殊类型,主要用于地理空间数据类型,通常使用较少;

Full-text索引:全文索引

我们平常所说的索引,若没有特别指明,一般都指B+树结构组织的索引。其中:聚集索引、复合索引、前缀索引、唯一索引默认都是使用B+tree索引,统称为索引。

mysql复合索引btree结构_mysql - index 索引 之 索引结构(B+tree)_第1张图片

BTREE结构:

Btree 又叫做 多路平衡搜索树,一颗M叉的Btree特性如下:

树中每个节点,最多包含m个孩子(子节点),二叉树最多包含2个孩子;

除根节点与叶子节点外,每个节点至少有 ceil(m/2) 个孩子,ceil:向上取整;

若根节点不是叶子节点,则至少有2个孩子;

所有的叶子节点,都在同一层;

每个非叶子节点,由n个key 与 n+1个指针组成,其中:ceil(m/2) -1 <= n <= m-1

以5叉Btree为例,key的数量:公式推导ceil(m/2) -1 <= n <= m-1,故 2 <= n <= 4。当n>4时,中间节点分裂到父节点,两边节点分裂。

插入  C N G A H E K Q M F W L T Z D P R X Y S 数据为例:

演变过程如下:

插入前4个字母:C N G A 244310ed4cdc01e044947d9833512aeb.png

插入H,n>4,中间元素G字母向上分裂到新的节点mysql复合索引btree结构_mysql - index 索引 之 索引结构(B+tree)_第2张图片

插入  E K Q 不需要分裂:mysql复合索引btree结构_mysql - index 索引 之 索引结构(B+tree)_第3张图片

插入M,中间元素M字母向上分裂到父节点Gmysql复合索引btree结构_mysql - index 索引 之 索引结构(B+tree)_第4张图片

插入F W L T 不需要分裂:mysql复合索引btree结构_mysql - index 索引 之 索引结构(B+tree)_第5张图片

插入Z,中间元素T向上分裂到父节点中mysql复合索引btree结构_mysql - index 索引 之 索引结构(B+tree)_第6张图片

插入D ,中间元素D向上分裂到父节点中,然后插入 P R X Y不需要分裂:mysql复合索引btree结构_mysql - index 索引 之 索引结构(B+tree)_第7张图片

最后插入S,N P Q R节点n>5,中间节点Q向上分裂,但分裂后父节点DGMT的n>5,中间节点M向上分裂:mysql复合索引btree结构_mysql - index 索引 之 索引结构(B+tree)_第8张图片

到此,该BTREE树就已经构建完成了。BTREE 和 二叉树相比,查询数据的效率更高,因为对于相同的数据量来说,BTREE的层级结构比二叉树小,因此搜索速度更快。

B+TREE结构:

特点:

B+tree 为 BTree的变种,B+tree 和 BTree 的区别为:

n叉B+tree最多含有n个key,而BTree最多含有n-1个key;

B+tree的叶子节点保存所有的key信息,依key大小顺序排列;

B+tree只有叶子节点保存DATA信息,并且与key绑定;

B+tree所有的非叶子节点,都可以看做是key的索引部分

mysql复合索引btree结构_mysql - index 索引 之 索引结构(B+tree)_第9张图片

由于B+tree,只有叶子节点保存key信息,查询任何key都要从root走到叶子。所以B+tree的查询效率更加稳定。

mysql 中的B+tree:

mysql索引数据结构对经典的B+tree进行了优化。在原B+tree的基础上,增加了一个指向相邻叶子节点的链表指针,形成了带有顺序指针的B+tree,提高区间访问性能。

结构示意图:

mysql复合索引btree结构_mysql - index 索引 之 索引结构(B+tree)_第10张图片

你可能感兴趣的:(mysql复合索引btree结构_mysql - index 索引 之 索引结构(B+tree))