熟悉了b+tree索引的一个基本的创建过程,接下来我们来了解下b+tree索引与具体记录之间的关系。
拿之前的图为例,如下:
很多人会问,通过这种数据结构,我们如何找到需要的数据呢?
其实之前我们提到过,数据结构即索引会通过某种方式与数据表中的数据记录产生联系(指向)。
那这种联系(指向)是在哪里体现的呢?
在Mysql系统中,不同的存储引擎下b+tree索引与数据之间关系的表现方式是不同的。
在myisam存储引擎中,叶节点(即最底部节点)的data域会存放的是数据记录的地址,注意,只有叶节点存放数据地址,其他的节点不存储数据地址,只存储关键字key和对子节点的引用,如下所示:
在myisam索引下,上图中,我们对字段col2添加了索引,当查询条件字段col2为5的这个数据的时候,会从上之下依次查找,找到最下面节点中关键词为5 的节点,然后找到其对应数据记录的地址0x6A,然后根据0x6A这个地址迅速找到存放的那条数据记录20,5,Jim。
与myisam不同的是,在innodb存储引擎中,当索引的关键字key是主键的时候,叶节点(即最底部节点)的data域会存放的是完整的数据记录,只有叶节点存放数据记录,其他的节点不存储数据记录,只存储关键字和对子节点的引用,如下所示:
也就是说,在innodb存储引擎下,只有当我们对字段加主键索引的时候,这个索引的叶节点才会存储对应的数据记录,因此我们在数据结构上查询到对应的key就能找到数据了,这种索引就因为叶节点存放数据记录,所以被mysql官方称呼为聚簇索引。
需要注意的是,在innodb存储引擎下,当我们对字段A加普通索引的时候,这个索引的叶节点不会存储对应的数据记录,而是会存储对应的主键字段B的值,根据B的值再去主键B的数据结构下查找数据记录,从而得到数据记录。