返回顶部

mysql - index 索引 之 索引结构(B+tree)

概述:

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

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

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

    1. BTREE索引: 最常见的索引类型,大部分索引都支持B树索引;
    2. HASH索引:   只有Memory引擎支持,使用场景简单;
    3. R-tree索引:   空间索引是MyISAM引擎的一个特殊类型,主要用于地理空间数据类型,通常使用较少;
    4. Full-text索引:全文索引

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

 

 

BTREE结构:

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

  1. 树中每个节点,最多包含m个孩子(子节点),二叉树最多包含2个孩子;
  2. 除根节点与叶子节点外,每个节点至少有 ceil(m/2) 个孩子,ceil:向上取整;
  3. 若根节点不是叶子节点,则至少有2个孩子;
  4. 所有的叶子节点,都在同一层;
  5. 每个非叶子节点,由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  数据为例:

演变过程如下:

  1.  插入前4个字母:C N G A 
  2. 插入H,n>4,中间元素G字母向上分裂到新的节点
  3. 插入  E K Q 不需要分裂:
  4. 插入M,中间元素M字母向上分裂到父节点G
  5. 插入F W L T 不需要分裂:
  6. 插入Z,中间元素T向上分裂到父节点中
  7. 插入D ,中间元素D向上分裂到父节点中,然后插入 P R X Y不需要分裂:
  8. 最后插入S,N P Q R节点n>5,中间节点Q向上分裂,但分裂后父节点DGMT的n>5,中间节点M向上分裂:

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

 B+TREE结构:

特点:

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

  1. n叉B+tree最多含有n个key,而BTree最多含有n-1个key;
  2. B+tree的叶子节点保存所有的key信息,依key大小顺序排列;
  3. B+tree只有叶子节点保存DATA信息,并且与key绑定;
  4. B+tree所有的非叶子节点,都可以看做是key的索引部分

 

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

 mysql 中的B+tree:

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

结构示意图:

 

posted @ 2021-01-17 00:03  Be-myself  阅读(439)  评论(0编辑  收藏  举报
levels of contents 点击查看具体代码内容