机械硬盘

构造

MySQL-InnoDB存储引擎为何使用B+树索引

 

磁盘块/簇

磁盘块/簇是虚拟出来的,块是操作系统中最小的逻辑存储单位。操作系统与磁盘打交道的最小单位是磁盘块。

 

Windows叫簇,Linux下叫块,每个簇或者块可以包括2、4、8、16、32、64…2的n次方个扇区。

为什么存在磁盘块?

①读取方便。

由于扇区的数量比较多,导致在寻址时比较困难,所以操作系统就将相邻的扇区组合在一起,形成一个块,再对块进行整体的操作

②分离对底层的依赖。

操作系统忽略对底层物理存储结构的设计。通过虚拟出来磁盘块的概念,在系统中认为块是最小的单位。

page

操作系统经常与内存和硬盘这两种存储设备进行通信,类似于“块”的概念,都需要一种虚拟的基本单位。所以,与内存操作,是虚拟一个页的概念来作为最小单位。与硬盘打交道,就是以块为最小单位。

B+树

MySQL-InnoDB存储引擎为何使用B+树索引

 

特点1:B+树非叶子节点上是不存储数据的,仅存储键值。

innodb中页的默认大小是16KB。如果用来存储键值,那么会存储很多。这样就会使得Tree中每一层中节点非常多、树会更矮、更胖,因此每次磁盘IO的次数会更少。

因为我通过非叶子节点直接找到磁盘块,找到磁盘块之后就直接加载,也就加载几次。

特点2:B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。

B+树索引存储方式

聚集索引(聚簇索引)

以innodb作为存储引擎的表,表中的数据都会有一个主键,即使你不创建主键,系统也会帮你创建一个隐式的主键。

这是因为innodb是把数据存放在B+树中的,而B+树的键值就是主键,在B+树的叶子节点中,存储了表中所有的数据。这种以主键作为B+树索引的键值而构建的B+树索引,我们称之为聚集索引。

非聚集索引(非聚簇索引)

以主键以外的列值作为键值构建的B+树索引,我们称之为非聚集索引。

非聚集索引与聚集索引的区别在于非聚集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表。

相关文章: