`

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

阅读更多

摘抄和整理,非原创!!!

官方定义:

在《数据库原理》一书中是这么解释聚簇索引和非聚簇索引的区别的:
聚簇索引的叶子节点就是数据节点,
而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。

 

聚集索引:表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个聚集索引,因为真实数据的物理顺序只能有一种。

"聚集"指实际的数据行和相关的键值都保存在一起

聚簇索引的二级索引:叶子节点不会保存引用的行的物理位置,而是保存了行的主键值

 

注意:数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的,如果主键不是自增id,那么可以想象,它会干些什么,不断地调整数据的物理地址、分页,当然也有其他一些措施来减少这些操作,但却无法彻底避免。但,如果是自增的,那就简单了,它只需要一页一页地写,索引结构相对紧凑,磁盘碎片少,效率也高。

 

非聚集索引:表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致

MyISAM的B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址主索引和辅助索引没啥区别,只是主索引中的key一定得是唯一的

 

聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引。

 

因此,MYSQL中不同的数据存储引擎对聚簇索引的支持不同就很好解释了。下面,我们可以看一下MYSQL中MYISAM和INNODB两种引擎的索引结构。

如原始数据为:




 

MyISAM引擎的数据存储方式如图:



 

MYISAM是按列值与行号来组织索引的。它的叶子节点中保存的实际上是指向存放数据的物理块的指针。从MYISAM存储的物理文件我们能看出,MYISAM引擎的索引文件(.MYI)和数据文件(.MYD)是相互独立的。

而InnoDB按聚簇索引的形式存储数据,所以它的数据布局有着很大的不同。它存储数据的结构大致如下:



 

注:聚簇索引中的每个叶子节点包含主键值、事务ID、回滚指针(rollback pointer用于事务和MVCC)和余下的列(如col2)。

INNODB的二级索引与主键索引有很大的不同。InnoDB的二级索引的叶子包含主键值,而不是行指针(row pointers),这减小了移动数据或者数据页面分裂时维护二级索引的开销,因为InnoDB不需要更新索引的行指针。其结构大致如下:



 

INNODB和MYISAM的主键索引与二级索引的对比:



 

InnoDB的的二级索引的叶子节点存放的是KEY字段加主键值。因此,通过二级索引查询首先查到是主键值,然后InnoDB再根据查到的主键值通过主键索引找到相应的数据块。而MyISAM的二级索引叶子节点存放的还是列值与行号的组合,叶子节点中保存的是数据的物理地址。所以可以看出MYISAM的主键索引和二级索引没有任何区别,主键索引仅仅只是一个叫做PRIMARY的唯一、非空的索引,且MYISAM引擎中可以不设主键。

 

 为了更形象说明这两种索引的区别,我们假想一个表如下图存储了4行数据。其中Id作为主索引,Name作为辅助索引。图示清晰的显示了聚簇索引和非聚簇索引的差异。

 


 

对于聚簇索引存储来说,行数据和主键B+树存储在一起,辅助键B+树只存储辅助键和主键,主键和非主键B+树几乎是两种类型的树。对于非聚簇索引存储来说,主键B+树在叶子节点存储指向真正数据行的指针,而非主键。

InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。

MyISM使用的是非聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。

为了更形象说明这两种索引的区别,我们假想一个表如下图存储了4行数据。其中Id作为主索引,Name作为辅助索引。图示清晰的显示了聚簇索引和非聚簇索引的差异。

 



 

我们重点关注聚簇索引,看上去聚簇索引的效率明显要低于非聚簇索引,因为每次使用辅助索引检索都要经过两次B+树查找,这不是多此一举吗?聚簇索引的优势在哪?

1 由于行数据和叶子节点存储在一起,这样主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了,如果按照主键Id来组织数据,获得数据更快。

2 辅助索引使用主键作为"指针" 而不是使用地址值作为指针的好处是,减少了当出现行移动或者数据页分裂时辅助索引的维护工作,使用主键值当作指针会让辅助索引占用更多的空间,换来的好处是InnoDB在移动行时无须更新辅助索引中的这个"指针"。也就是说行的位置(实现中通过16K的Page来定位,后面会涉及)会随着数据库里数据的修改而发生变化(前面的B+树节点分裂以及Page的分裂),使用聚簇索引就可以保证不管这个主键B+树的节点如何变化,辅助索引树都不受影响。

  • 大小: 34.2 KB
  • 大小: 60.3 KB
  • 大小: 80.1 KB
  • 大小: 57.1 KB
  • 大小: 124.9 KB
  • 大小: 187.8 KB
分享到:
评论

相关推荐

    005.聚簇索引与非聚簇索引b+树实现有什么区别?.mp4

    聚簇索引与非聚簇索引b+树实现有什么区别?.mp4 聚簇索引与非聚簇索引b+树实现有什么区别?.mp4 聚簇索引与非聚簇索引b+树实现有什么区别?.mp4 聚簇索引与非聚簇索引b+树实现有什么区别?.mp4 聚簇索引与非聚簇索引...

    MySQL 聚簇索引.rar

    在MySQL中,索引分为两种主要类型:聚簇索引(Clustered Index)和非聚簇索引(Secondary Index或Non-Clustered Index)。聚簇索引决定了数据行在磁盘上的物理存储方式,而非聚簇索引则不直接决定数据行的位置,而是...

    数据库中聚簇索引与非聚簇索引的区别[图文]

    数据库中的索引是提高查询效率的关键工具,主要分为聚簇索引和非聚簇索引。聚簇索引决定了数据的实际存储顺序,它的每个索引条目都直接指向数据行,因此一个表只能有一个聚簇索引。而非聚簇索引的顺序与数据存储顺序...

    69 更新数据的时候,自动维护的聚簇索引到底是什么?l.pdf

    聚簇索引结构本质上是一种特殊的B+树数据结构,使得数据记录的物理顺序和键值的逻辑(索引)顺序相同。 在聚簇索引中,数据记录实际上存储在B+树的叶子节点上,因此叶子节点就是数据页本身。当聚簇索引建立之后,表...

    mysql索引原理之聚簇索引1

    索引分为聚簇索引(Clustered Index)和非聚簇索引(Secondary Index)。聚簇索引决定了数据行在磁盘上的物理存储顺序,而非聚簇索引则不遵循这种顺序。 1、MySQL的索引: 在MySQL中,不同的存储引擎对索引的实现...

    详解MySQL 聚簇索引与非聚簇索引

    从物理文件也可以看出 InnoDB(聚集索引)的数据文件只有数据结构文件.frm和数据文件.idb 其中.idb中存放的是数据和索引信息 是存放在一起的。 2、非聚集索引 表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点...

    行业-69 更新数据的时候,自动维护的聚簇索引到底是什么?l.rar

    一个表可以有多个非聚簇索引,但每次查询时,非聚簇索引需要通过索引找到对应的行号,然后再根据行号去数据页中获取数据,这个过程通常比聚簇索引慢一些。 当数据更新时,聚簇索引的维护至关重要。如果更新的字段是...

    SQL Server 聚集索引和非聚集索引的区别分析

    索引分为两种主要类型:聚集索引和非聚集索引,它们在数据存储和查询性能上具有显著区别。 **聚集索引(Clustered Index)** 聚集索引决定了数据在磁盘上的物理顺序,这意味着表中的每一行数据都是按照聚集索引的...

    SQL Server索引技术.pdf

    本文针对SQL Server的索引技术进行了详细的探讨,并提供了聚簇索引和非聚簇索引的详细信息。 聚簇索引是数据库索引的一种,它决定了表中数据的物理存储顺序。在聚簇索引中,数据行按照索引键的顺序存储在数据页上。...

    一篇文章讲清楚MySQL的聚簇-联合-覆盖索引、回表、索引下推.doc

    非聚簇索引(Non-Clustered Index)与聚簇索引不同,它的叶子节点中只存储了当前索引字段和主键 ID。假设我们在 age 字段上建一个普通索引,age 字段上面的索引存储结构就是非聚簇索引。 联合索引(Composite Index...

    Sybase索引的使用和优化

    Sybase 索引的使用和优化 Sybase 索引的使用和优化...在实际应用中,我们可以根据实际情况选择适合的索引类型,例如聚簇索引、非聚簇索引、覆盖索引等,并且根据实际情况对索引进行优化和调整,以达到最佳的查询性能。

    B+树聚簇索引 精讲开发培训

    在MySQL中,B+树聚簇索引是常用的数据结构,尤其对于大规模数据的处理至关重要。本文将深入探讨索引的本质、分类,以及B+树的优势。 首先,理解索引的本质:索引是一种有序的数据结构,类似于字典中的目录,帮助...

    数据库实验索引的创建与使用.pdf

    我们也了解了聚簇索引和非聚簇索引的区别,并学习了如何删除索引。这些知识点对于数据库管理和设计都是非常重要的。 体会 通过本实验,我深刻地体会到了索引的重要性。索引可以帮助数据库管理系统快速地定位和检索...

    sybase索引的使用和优化

    非聚簇索引适合用于频繁的聚合函数查询、JOIN、ORDER BY 和 GROUP BY 操作。然而,过多的非聚簇索引可能导致更新操作变慢,需要权衡查询速度与更新速度之间的平衡。 3. 覆盖索引 (Covering Indexes) 覆盖索引是包含...

    SqlServer索引工作原理

    SqlServer索引工作原理可以分为两大类:聚簇索引和非聚簇索引。 聚簇索引是一种树形结构的索引,它的数据物理存储顺序和索引顺序一致的。聚簇索引的数据页是按照顺序排列的,例如按照LastName的顺序排列的。聚簇...

    关于数据库中的索引原理

    根据索引的数据存储方式不同,索引可以分为两大类:聚簇索引(Clustered Index)和非聚簇索引(Non-Clustered Index)。 - **聚簇索引**:聚簇索引决定了表中行的实际物理顺序。一个表只能有一个聚簇索引。 - **非...

    关于SQL Server中索引使用及维护简介

    本篇文章将探讨聚簇索引、非聚簇索引以及覆盖索引的使用和维护策略。 1. **聚簇索引**:聚簇索引决定了数据在磁盘上的物理排列顺序,其索引页直接指向数据页,因此查找速度快。每张表只能有一个聚簇索引,创建时需...

    利用索引提高SQLServer数据处理效率

    在SQL Server数据库中,索引是提升数据处理效率的...合理使用聚簇索引、非聚簇索引和覆盖索引,结合对查询模式的深入理解和系统负载的实时监控,可以显著提高SQL Server的数据处理效率,从而提升整个应用系统的性能。

    浅析优化处理SQL Server数据库索引.pdf

    因此,在选择是否使用非聚簇索引时要格外谨慎,尤其是在有限的硬盘和内存空间下,应限制非聚簇索引的数量。 覆盖索引(covering indexes)是一种特殊的非聚簇索引,它的索引项中包含了查询所需的所有信息,因此执行...

Global site tag (gtag.js) - Google Analytics