Innodb中聚簇索引

 在一次面试过程中别问道Innodb中聚簇索引,让我介绍一下,当时表现很差,回答的条理不清。于是回来后对Innodb的聚簇索引进行进一步的理解和学习。

理解聚簇索引前先明确一下索引的本质是什么?

  MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是一种数据结构。而且可以知道Innodb中索引采用的数据结构都是B+tree的结构,聚簇索引也不例外。

在了解B+tree之前也可以了解一下B-tree,因为B+tree就是B-tree的变体所以可以先了解一下B-tree和B+tree

转自:https://www.cnblogs.com/shijianchuzhenzhi/p/6666537.html

B-Tree介绍

B-Tree是一种多路搜索树(并不是二叉的):
       1.定义任意非叶子结点最多只有M个儿子;且M>2;
       2.根结点的儿子数为[2, M];
       3.除根结点以外的非叶子结点的儿子数为[M/2, M];
       4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
       5.非叶子结点的关键字个数=指向儿子的指针个数-1;
       6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
       7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;
       8.所有叶子结点位于同一层;
       如:(M=3)

 

Innodb中聚簇索引
B-树的特性:
       1.关键字集合分布在整颗树中;
       2.任何一个关键字出现且只出现在一个结点中;
       3.搜索有可能在非叶子结点结束;
       4.其搜索性能等价于在关键字全集内做一次二分查找;
       5.自动层次控制;

B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点;

B+Tree介绍

B+树是B-树的变体,也是一种多路搜索树:

       1.其定义基本与B-树同,除了:

       2.非叶子结点的子树指针与关键字个数相同;

       3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);

       5.为所有叶子结点增加一个链指针;

       6.所有关键字都在叶子结点出现;

       如:(M=3)

Innodb中聚簇索引

B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

       B+的特性:

       1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

       2.不可能在非叶子结点命中;

       3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

       4.更适合文件索引系统;

在了解了B+tree的结构后,现在可以看

 首先聚簇索引(Clustered Index)也称为聚集索引,聚类索引,簇集索引 ;

 所谓聚簇索引,就是指主索引文件和数据文件为同一份文件,即聚簇索引的叶节点就是数据节点(Myisam中非聚簇索引中索引文件和数据文件不是同一份文件,索引文件中叶子节点存储数据的物理地址),聚簇索引主要用在Innodb存储引擎中。在该索引实现方式中B+Tree的叶子节点上的data就是数据本身,key为主键。

那么聚簇索引建立的过程是什么样的呢?

在Innodb中一张表中聚簇索引建立的过程:

1)  有主键时,根据主键创建聚簇索引
2)  没有主键时,会用一个唯一且不允许为空的索引列做为主键,成为此表的聚簇索引
3) 如果以上两个都不满足那innodb自己创建一个虚拟的字段为主键,这个字段长度为6个字节,类型为长整形,根据该虚拟主键创建聚集索引