MySQL之聚簇索引

聚簇,其实是相对于InnoDB这个数据库引擎来说的,因此在将聚簇索引的时候,我们通过InnoDB和MyISAM这两个MySQL的数据库引擎展开。

InnoDB和MyISAM的数据分布对比

CREATE TABLE test (col1 int NOT NULL,
                   col2 int NOT NULL,
                   PRIMARY KEY(col1),
                   KEY(col2));

首先通过以上SQL语句创建出一个表格,其中col1是主键,两列数据均创建了索引。然后我们数据的主键取值为1-10000,按照随机的顺序插入数据库中。

MyISAM的数据分布

MyISAM的数据存储逻辑比较简单,就是按照数据插入的顺序创建出一个数据表格。直观上来看如下图:
MySQL之聚簇索引_第1张图片
所以得到的结论就是在MyISAM中建立索引是否是主键索引其实是没有区别的,唯一不同的就是这是一个“主键的索引”。

InnoDB的数据分布

因为InnoDB支持聚簇索引,所以会与MyISAM上的索引实现方式有所区别。
我们先看看基于主键的聚簇索引在InnoDB上的实现方式:
MySQL之聚簇索引_第2张图片
可以看到,和InnoDB中的主键索引不同,二级索引并没有在叶子结点存储所有的行数据信息,而是除了索引列的值外,只存储了这个数据行所对应的主键的信息。我们知道在MyISAM中,二级索引和主键索引一样,除了索引列的值外,只存储了一个指针(行号)的信息。
对比一下两个引擎上的二级索引。即存储指针和存储主键值的优劣。
首先存储主键值会比只存储一个指针带来的空间开销更大。但是当我们数据表在进行分裂或者其他改变结构的操作的时候,存储主键值的索引并不会收到影响,而存储指针的索引,可能就要重新进行更新维护。

用一个图对两个引擎中的两种索引进行对比:
MySQL之聚簇索引_第3张图片

你可能感兴趣的