聚簇,其实是绝对于 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 的数据存储逻辑比较简单,就是依照数据插入的程序创立出一个数据表格。直观上来看如下图:
能够看出,数据就是依照插入的程序“一行一行”生成的。后面还会有一个行号的字段,用途就是在查找到索引的时候可能疾速地定位到该行索引的地位。
咱们再来看一下具体的细节:
上图展现的状况就是在 MyISAM 引擎下,依照主键建设的索引的具体实现。能够看出在主键依照顺序排列在叶子结点上的同时,节点中还存储着这个主键在数据库表格中存在的具体的行号,正如咱们下面所说的,这个行号能够帮忙咱们疾速地定位到表中数据的地位,也能够把这个行号了解为一个指针,指向了这个主键所在的具体数据行。
那么如果咱们依照 col2 建设索引呢?会有什么不同吗?答案是不会的:
所以失去的论断就是在 MyISAM 中建设索引是否是主键索引其实是没有区别的,惟一不同的就是这是一个“主键的索引”。
InnoDB 的数据分布
因为 InnoDB 反对聚簇索引,所以会与 MyISAM 上的索引实现形式有所区别。
咱们先看看基于主键的聚簇索引在 InnoDB 上的实现形式:
首先,和 MyISAM 上的主键索引一样,这里的索引的叶子结点上同样也是包含了主键的值,并且主键的值是依照顺序排列的。不同的是,每一个叶子结点还包含了事务 id,回滚指针和其余非主键列的值(这里指的 col2)。所以咱们能够了解为 InnoDB 上的聚簇索引,是将原来表格中的所有的行数据依照主键进行排列而后放在了索引的叶子节点上。这就是一个与 MyISAM 在主键索引上的一个不同。MyISAM 的主键索引在查找到对应的主键值之后须要通过指针(行号)再去表中找到绝对应的数据行,而 InnoDB 的主键索引,将数据信息全副放在了索引外面,能够间接在索引中查找拿到。
再来看看 InnoDB 中的二级索引的状况:
能够看到,和 InnoDB 中的主键索引不同,二级索引并没有在叶子结点存储所有的行数据信息,而是除了索引列的值外,只存储了这个数据行所对应的主键的信息。咱们晓得在 MyISAM 中,二级索引和主键索引一样,除了索引列的值外,只存储了一个指针(行号)的信息。
比照一下两个引擎上的二级索引。即存储指针和存储主键值的优劣。
首先存储主键值会比只存储一个指针带来的空间开销更大。然而当咱们数据表在进行决裂或者其余扭转构造的操作的时候,存储主键值的索引并不会收到影响,而存储指针的索引,可能就要从新进行更新保护。
用一个图对两个引擎中的两种索引进行比照: