mysql 聚集索引 非聚集索引 概念梳理

聚集索引

  一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。
  聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(联合索引)(不过mysql的innodb只支持主键聚集索引,不支持联合聚集索引),就像电话簿按姓氏和名字进行组织一样。

非聚集索引

  一种索引,该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表可以包含多个非聚集索引。

InnoDB索引实现

InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

mysql 聚集索引 非聚集索引 概念梳理_第1张图片

  上图是InnoDB聚集索引的数据结构示意图,可以看到叶节点的data域包含了完整的数据记录。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),innodb会按照如下规则进行处理:
  1,如果一个主键被定义了,那么这个主键就是作为聚集索引
  2,如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引
  3,如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。

接下来说一说innodb的非聚集索引
  和其他引擎不同的是,innodb的非聚集索引的叶子节点上的data是主键(所以聚集索引的key,不能过长)。为什么存放的主键,而不是记录所在地址呢,理由相当简单,因为记录所在地址并不能保证一定不会变,但主键可以保证,如下图:
  
mysql 聚集索引 非聚集索引 概念梳理_第2张图片
图中第二行为叶子节点,叶子结点的data域,则为主键。

  PS:在梳理概念和查阅资料的过程中,发现自己对唯一索引和聚集索引的概念有点混淆,特地查了一下:

  唯一索引是给所做的索引增加了唯一性的约束,添加,修改索引列中数据时,不允许出现重复值.它可以是聚集索引,也可以是非聚集的,就看如何去定义。
  主键索引是把主键列定义为索引,主键具有唯一性,所以主键索引是唯一索引的一种特殊形式 。

你可能感兴趣的:(mysql)