聚簇索引和非聚簇索引

目录

  • 索引
    • 聚簇索引
    • 非聚簇索引
    • 聚簇索引和非聚簇索引的区别

索引

  索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。这里主要简单讲解下两种索引:聚簇索引(也称聚类索引、簇集索引)和非聚簇索引(也称非聚类索引、非簇集索引)。

聚簇索引

  聚簇索引并不是数据库索引的某种类型,其描述的是数据的一种存储方式。我们知道,在InnoDB中,数据是以B+树的形式来进行存储的,其特点就是数据都存储在叶子节点上,非叶子节点值存储索引信息,既Key和指向子节点的指针。这种索引和数据的存储方式叫做聚簇索引。通常来说,“聚簇”的意思是数据行和键紧挨着。我们一般设置主键索引就为聚簇索引。

  一个没加主键的表,其数据无序的放置在磁盘上,一行一行排列得很整齐。如果给表加上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是平衡树结构,换句话说,就是整个表就变成了一个索引,也就是所谓的聚簇索引。这就是为什么一个表只能有一个主键,一个表只能有一个聚簇索引的原因,因为主键的作用就是把表的数据结构格式转换成索引的格式来放置。

 
聚簇索引和非聚簇索引_第1张图片

 
在该树状结构中,除叶子节点外,树中的所有节点的数据都是由主键字段中的数据构成,也就是我们通常指定作为主键的 ID 字段。在叶子节点部分才是我们存表中数据的地方。

在InnoBD中通过主键来聚簇数据,也就是说聚簇索引的的B+树上的叶子节点所存储的key总是主键值,如果没有定义主键,InnoDB会选择一个唯一的非空索引来代替,如果也没有这样的索引,InnoDB会隐式地定义一个主键来聚簇数据,这个隐式的主键被称为 rowID 。

而在InnoDB中,聚簇索引的B+树的叶子节点是一个数据页,默认大小为16K,这些叶子节点,也就是数据页的数据其实是一个有序链表,会按照主键递增的顺序来存储。如果我们要访问 ID 为10的记录,InnoDB根据索引找到了key为11的所有,访问其左节点,比较key值直到找到为止。
 
聚簇索引和非聚簇索引_第2张图片
 

 

非聚簇索引

讲完聚簇索引,接下来我们来聊一下非聚簇索引,也就是我们平常经常提起和使用的常规索引。

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

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

聚簇索引和非聚簇索引_第3张图片

 

 

聚簇索引和非聚簇索引的区别

  • 聚集索引可以一次查到需要查找的数据,而通过非聚集索引第一次只能查到记录对应的主键值再去聚簇索引中查询所需要的记录,这个过程称为回表。正是由于如此,所以通常来说聚簇索引的查询效率要比非聚簇索引高。
  • 聚集索引一张表只能有一个,而非聚集索引一张表可以有多个。

你可能感兴趣的:(MySQL,MySQL,聚簇索引与非聚簇索引,InnoDB)