简单理解聚集索引和非聚集索引

一  聚集索引的形成:

InnoDB要求表必须有主键(MyISAM可以没有),innodb会按照如下规则进行处理: 
  1,如果一个主键被定义了,那么这个主键就是作为聚集索引 
  2,如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引 
  3,如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。

 

二 聚集索引数据结构模(转):

简单理解聚集索引和非聚集索引_第1张图片

 

上图就是带有主键的表(聚集索引)的结构图。图画的不是很好, 将就着看。其中树的所有结点(底部除外)的数据都是由主键字段中的数据构成,也就是通常我们指定主键的id字段。最下面部分是真正表中的数据。 假如我们执行一个SQL语句:

select * from table where id = 1256;

首先根据索引定位到1256这个值所在的叶结点,然后再通过叶结点取到id等于1256的数据行。 这里不讲解平衡树的运行细节, 但是从上图能看出,树一共有三层, 从根节点至叶节点只需要经过三次查找就能得到结果。如下图

简单理解聚集索引和非聚集索引_第2张图片

 

三 非聚集索引和聚集索引的区别:

非聚集索引和聚集索引一样, 同样是采用平衡树作为索引的数据结构。索引树结构中各节点的值来自于表中的索引字段, 假如给user表的name字段加上索引 , 那么索引就是由name字段中的值构成,在数据改变时, DBMS需要一直维护索引结构的正确性。如果给表中多个字段加上索引 , 那么就会出现多个独立的索引结构,每个索引(非聚集索引)互相之间不存在关联。 如下图

简单理解聚集索引和非聚集索引_第3张图片


每次给字段建一个新索引, 字段中的数据就会被复制一份出来, 用于生成索引。 因此, 给表添加索引,会增加表的体积, 占用磁盘存储空间。所以索引不是建立越多越好的。

非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据,如下图

简单理解聚集索引和非聚集索引_第4张图片

从上图可以看出非聚集索引都是要根据存储的主键值通过聚集索引,定位到数据,聚集索引(主键)是通往真实数据所在的唯一路径。

然而, 有一种例外可以不使用聚集索引就能查询出所需要的数据,那就是覆盖索引(联合索引)。当为字段建立索引以后, 字段中的内容会被同步到索引之中。这种方式就不用经过聚集索引拿到数据。

 

参考:https://zhuanlan.zhihu.com/p/23624390

 

 

你可能感兴趣的:(mysql)