mysql - index 索引 之 索引结构(B+tree)
概述:
索引是在mysql的存储引擎层中实现的,不是在服务层。
故,每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型。
mysql目前,提供了一下4中索引:
- BTREE索引: 最常见的索引类型,大部分索引都支持B树索引;
- HASH索引: 只有Memory引擎支持,使用场景简单;
- R-tree索引: 空间索引是MyISAM引擎的一个特殊类型,主要用于地理空间数据类型,通常使用较少;
- Full-text索引:全文索引
我们平常所说的索引,若没有特别指明,一般都指B+树结构组织的索引。其中:聚集索引、复合索引、前缀索引、唯一索引默认都是使用B+tree索引,统称为索引。
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
- 插入H,n>4,中间元素G字母向上分裂到新的节点
- 插入 E K Q 不需要分裂:
- 插入M,中间元素M字母向上分裂到父节点G
- 插入F W L T 不需要分裂:
- 插入Z,中间元素T向上分裂到父节点中
- 插入D ,中间元素D向上分裂到父节点中,然后插入 P R X Y不需要分裂:
- 最后插入S,N P Q R节点n>5,中间节点Q向上分裂,但分裂后父节点DGMT的n>5,中间节点M向上分裂:
到此,该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的索引部分
由于B+tree,只有叶子节点保存key信息,查询任何key都要从root走到叶子。所以B+tree的查询效率更加稳定。
mysql 中的B+tree:
mysql索引数据结构对经典的B+tree进行了优化。在原B+tree的基础上,增加了一个指向相邻叶子节点的链表指针,形成了带有顺序指针的B+tree,提高区间访问性能。
结构示意图: