`
sakakokiya
  • 浏览: 507370 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

什么是聚集索引和非聚集索引? 分布介绍一下

阅读更多
(1)非聚集索引
非聚集索引与课本中的索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。如果在表中未创建聚集索引,则无法保证这些行具有任何特定的顺序。
典型的桌面数据库使用的是非聚集索引。在这类索引中,索引键值是有序的,而每个索引节点所指向的数据行是无序的。一个SQL Server表最多可以拥有255个非聚集索引。
非聚集索引与聚集索引一样有 B-树结构,但是有两个重大差别:
l         数据行不按非聚集索引键的顺序排序和存储。
l         非聚集索引的叶层不包含数据页。
相反,叶节点包含索引行。每个索引行包含非聚集键值以及一个或多个行定位器,这些行定位器指向有该键值的数据行(如果索引不唯一,则可能是多行)。非聚集索引可以在有聚集索引的表、堆集或索引视图上定义。在 SQL Server中,非聚集索引中的行定位器有两种形式:
l         如果表是堆集(没有聚集索引),行定位器就是指向行的指针。该指针用文件标识符 (ID)、页码和页上的行数生成。整个指针称为行 ID。
l         如果表是堆集(没有聚集索引),行定位器就是指向行的指针。该指针用文件标识符 (ID)、页码和页上的行数生成。整个指针称为行 ID。
由于非聚集索引将聚集索引键作为其行指针存储,因此使聚集索引键尽可能小很重要。如果表还有非聚集索引,请不要选择大的列作为聚集索引的键。
在创建非聚集索引之前,应先了解您的数据是如何被访问的。可考虑将非聚集索引用于:
l         包含大量非重复值的列,如姓氏和名字的组合(如果聚集索引用于其它列)。如果只有很少的非重复值,如只有 1 和 0,则大多数查询将不使用索引,因为此时表扫描通常更有效。
l         不返回大型结果集的查询。
l         返回精确匹配的查询的搜索条件(WHERE 子句)中经常使用的列。
l         经常需要联接和分组的决策支持系统应用程序。应在联接和分组操作中使用的列上创建多个非聚集索引,在任何外键列上创建一个聚集索引。
l         在特定的查询中覆盖一个表中的所有列。这将完全消除对表或聚集索引的访问。
(2)聚集索引
聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
聚集索引在系统数据库表sysindexes 内有一行,其 indid = 1。数据链内的页和其内的行按聚集索引键值排序。所有插入都在所插入行中的键值与排序顺序相匹配时执行。
SQL Server将索引组织为B-树。索引内的每一页包含一个页首,页首后面跟着索引行。每个索引行都包含一个键值以及一个指向较低级页或数据行的指针。索引的每个页称为索引节点。B-树的顶端节点称为根节点。索引的底层节点称为叶节点。每级索引中的页链接在双向链接列表中。在聚集索引内数据页组成叶节点。根和叶之间的任何索引级统称为中间级。
对于聚集索引,sysindexes.root 指向它的顶端。SQL Server 沿着聚集索引浏览以找到聚集索引键对应的行。为找到键的范围,SQL Server 浏览索引以找到这个范围的起始键值,然后用向前或向后指针扫描数据页。为找到数据页链的首页,SQL Server 从索引的根节点开始沿最左边的指针进行扫描.
聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。
对于聚集索引,人们往往有一些错误的认识。其中,最常见的错误有:
l         聚集索引会降低insert操作的速度,因为必须要向后移动一半的数据来为新插入的行腾出空间。这种认识是错误的,因为可以利用填充因子控制填充的百分比,从而在索引页上为新插入的数据保留空间。如果索引页填满了,SQL Server将会进行页拆分,在这种情况下只有第一个页才会受到影响。
l         在使用标识列的主键上创建聚集索引是一种好的设计方法,它可以使对表的操作达到最快速度。这种认识是错误的,它浪费了创建其它更有效的聚集索引的机会。并且,使用这种方法会把每个新插入的记录行都存储到表尾部的同一个的数据页中,这将导致数据库的热点和锁争用。笔者曾经见过采用这种方法设计的数据库,对于每一个新订单,客户服务人员都不得不等待数分钟来加以确认。
l         聚集索引是具有魔力的。如果哪个查询的速度不够快,那么就在该列上创建聚集索引,对于表的操作速度一定会得到提高。这种认识也是错误的,聚集索引只是比非聚集索引稍稍快了那么一点点。因为在每个表上只能创建一个聚集索引,所以它也是一种宝贵的性能资源,只有在那些经常作为条件查询一组记录行的列上才应该建立聚集索引。
在创建聚集索引之前,应先了解数据是如何被访问的。可考虑将聚集索引用于:
l         包含大量非重复值的列。
l         使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。
l         被连续访问的列。
l         返回大型结果集的查询。
l         经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对 ORDER BY 或 GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。
l         OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。应在主键上创建聚集索引。
注意,聚集索引不适用于:
l         频繁更改的列,这将导致整行移动(因为 SQL Server 必须按物理顺序保留行中的数据值)。这一点要特别注意,因为在大数据量事务处理系统中数据是易失的。
l         宽键,来自聚集索引的键值由所有非聚集索引作为查找键使用,因此存储在每个非聚集索引的叶条目内。
分享到:
评论

相关推荐

    索引介绍聚集索引和非聚集索引

    ### 索引介绍:聚集索引与非聚集索引 #### 一、索引的基本概念 在数据库中,索引是一种特殊的文件结构,它的主要目的是为了提高数据检索的速度。索引通过创建一种数据结构(例如B树)来实现这一点,这种结构允许...

    SQL Server 索引结构及其使用(聚集索引与非聚集索引)

    何时使用聚集索引或非聚集索引?下表总结了何时使用聚集索引或非聚集索引: | 动作描述 | 使用聚集索引 | 使用非聚集索引 | | --- | --- | --- | | 列经常被分组排序 | 应 | 不应 | | 返回某范围内的数据 | 应 | 不...

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

    聚集索引和非聚集索引是数据库管理系统中两种重要的索引类型,它们在数据库查询优化中扮演着关键角色。理解这两种索引的区别对于优化数据库性能至关重要。 首先,聚集索引(Clustered Index)决定了表中数据的实际...

    数据库非聚集索引 聚集索引 模式 索引

    首先,让我们了解一下**非聚集索引**。非聚集索引在数据库中不按照数据的实际物理顺序存储。每个非聚集索引条目包含键值和指向对应数据行的指针。这意味着,一个表可以有多个非聚集索引,每个索引都有自己的排序顺序...

    聚集索引与非聚集索引的区别

    在数据库领域,索引分为两大类:**聚焦索引(Clustered Index)**和**非聚焦索引(Non-clustered Index)**。 #### 二、聚焦索引详解 聚焦索引是一种特殊类型的索引,其键值的逻辑顺序直接决定了表中数据行的物理顺序...

    SQLServer聚集索引与非聚集索引讲解[借鉴].pdf

    聚集索引(Clustered Index)和非聚集索引(Non-Clustered Index)是SQL Server中两种不同的索引类型,了解它们的区别和应用场景对于提高数据库性能和查询效率至关重要。 一、索引结构 索引是一种特殊的目录,用于...

    SQLServer索引基础知识----聚集索引,非聚集索引[归纳].pdf

    索引可以分为聚集索引和非聚集索引两种,本文将详细介绍这两种索引的概念、特点和应用。 一、B+ 树 在讨论聚集索引和非聚集索引之前,需要先了解 B+ 树的概念。B+ 树是一种自平衡的搜索树,它可以保证树的高度保持...

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

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

    sqlserver 聚集索引和非聚集索引实例

    索引分为两种主要类型:聚集索引(Clustered Index)和非聚集索引(Nonclustered Index)。下面将详细介绍这两种索引的概念、特点以及在实际操作中的应用。 **聚集索引(Clustered Index)** 聚集索引决定了数据在...

    唯一非聚集索引变量传入时索引失效解决方案

    尝试三,鉴于上述问题,最终的解决方案是同时保留原有的唯一非聚集索引和创建一个新的非聚集索引,两者都针对`Mac2`字段。这样,在某些情况下,查询优化器可以选择使用新的非聚集索引,而不会影响`Mac2`字段的唯一性...

    在SQL Server中估算非聚集索引的大小.pdf

    作者岳莉通过实例分析,以student表为例,为字段"姓名"创建非唯一非聚集索引,并详细介绍了估算该索引大小的三个步骤。 首先,非聚集索引在SQL Server中以B-树结构存储,包括非叶级节点和叶级节点。非叶级节点负责...

    简单例子理解主键,索引,聚集索引,复合索引,非聚合索引

    一、 创建主键(主键=主键索引=聚集索引) 主键是什么? 答:拿主键可以唯一确定一条数据,它和物理存储排序一致,不能为空,一个表只能有一个。 原本没有创建的主键的表在磁盘上存储为: Id=0;username=username0;sex...

    浅析SQL Server 聚焦索引对非聚集索引的影响

    SQL Server中的索引是数据库性能优化的关键因素,主要分为聚集索引(Clustered Index)和非聚集索引(Nonclustered Index)。这篇文章主要探讨了聚集索引对非聚集索引的影响。 首先,让我们理解一下这两种索引的...

    索引和视图的创建和修改

    - **非聚集索引(Nonclustered Index)**:不改变数据存储顺序,而是单独存储索引数据,通常用于提高查询性能。 - **聚集索引(Clustered Index)**:直接决定了表中数据的物理存储顺序,因此一个表只能有一个聚集...

    【数据库】浅析Innodb的聚集索引与非聚集索引

    Mysql存储引擎之一的Innodb的索引,可以分为聚集索引与非聚集索引,这两种索引都是使用B+树组织的。 本文不讲解什么是索引,对索引不了解的同学可以先移步到我的另外一篇文章【数据库】mysql索引简谈 在分析这两种...

    Sql Server中的非聚集索引详细介

    当我们创建一个非聚集索引时,SQL Server会在索引树中为每个索引项存储键值和对应的RID。非聚集索引的B树结构允许快速定位到索引项,然后通过RID找到对应的数据行。在执行计划中,我们可以看到"索引查找...

    SQL Server和Oracle中索引介绍

    非聚集索引适合更新较少、查询性能需求高的场景,但也需谨慎处理,因为过多的非聚集索引可能会影响INSERT、UPDATE和DELETE操作的性能。 唯一索引确保索引中的键值是唯一的,可以是聚集或非聚集。这在需要确保数据...

Global site tag (gtag.js) - Google Analytics