【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(八)

索引概述.

索引是一种可以加快检索的数据库结构,它包含从表或视图的一列或多列生成的键,以及映射到指定数据存储位置的指针。创建设计良好的索引能够显著提高数据库查询和应用程序的性能。打个比方,如果我们将保存所有数据的数据库看作一本书,那么索引就是这本书的目录。除了提高检索速度之外,索引还可以强制表中的行具有唯一性,从而确保数据的完整性。
索引一旦被创建,将由DBMS自动管理维护,用户插入、删除以及修改记录时,DBMS会自动更新表中的索引。编写SQL查询代码时,有索引的表和没有索引的表在使用方法上是一致的。虽然索引能够在某种程度上提高性能,但我们需要避免在一个表中创建大量的索引,否则会影响插入、删除和修改数据记录的性能,加大DBMS调整索引的开销,拖延整个系统的响应速度。

索引类型.

在SQL Server中,有两种基本类型的索引:

  • 聚集索引
  • 非聚集索引

除此之外,还有以下几种索引:

  • 唯一索引
  • 视图索引
  • 全文索引
  • XML索引

聚集索引.

聚集索引中索引键的逻辑顺序与数据表中实际的物理存储顺序是相同的,而且由于真正的物理存储只有一份,所以一个数据表只能拥有一个聚集索引。创建和修改聚集索引是非常耗时的,需要根据索引键的逻辑顺序重新调整实际物理存储的顺序。
在SQL中创建PRIMARY KEY约束时,如果该数据表中还没有聚集索引,并且本次约束涉及的列也没有被施加唯一非聚集索引,那么系统就会自动为PRIMARY KEY所涉及的列创建唯一聚集索引。在创建UNIQUE约束时,默认将会创建唯一非聚集索引,如果数据表中还没有聚集索引,就可以为涉及到的属性列指定聚集索引。
在以下情况下,可以考虑使用聚集索引:

  • 包含有限数量的唯一值的列,如仅包含100个唯一状态码的列;
  • 使用BETWEEN、>、<、>=、<=这样的运算符来返回一个范围值的查询;
  • 返回大规模结果集的查询。

非聚集索引.

非聚集索引和聚集索引有着相似的索引结构,但不同处在于,非聚集索引不影响数据行的物理存储顺序,数据行实际的物理存储顺序和索引键的逻辑顺序并不一致。并且每个数据表可以有多个非聚集索引,而不像聚集索引那样只能拥有一个。
和聚集索引一样,非聚集索引也能够提升查询数据的速度,但过多的非聚集索引会降低插入和更新数据的速度,因为更新包含非聚集索引的数据表中的数据时,DBMS必须同步更新索引。如果一个表需要频繁地更新数据,就不应该对它建立太多的非聚集索引。

唯一索引.

唯一索引能够保证索引键中不包括重复的值,从而使表中的每一行在某种方式上具有唯一性。只有当【唯一性】是数据本身的特征时,指定唯一索引才有意义。举例,如果我们希望学生表中的"身份证号码"列的值是唯一的,虽然学生表中的主码为"学号",但我们可以为"身份证号码"创建一个UNIQUE约束。这之后,如果有尝试在该列中输入多个相同的身份证号码的情况,将会显示错误消息。使用多列唯一索引,能够保证索引键值中多列的组合是唯一的。
聚集索引和非聚集索引都可以是唯一的,也就是说,我们可以创建唯一聚集索引和唯一非聚集索引,注意这里的唯一,是指数据唯一性,不是说索引是唯一的。前面已经说过,聚集索引一个数据表只能拥有一个,但非聚集索引没有这样的限制。
创建PRIMARY KEYUNIQUE约束时会自动为指定的列创建唯一索引。如果是我们手动创建了唯一索引,并且目的是为了确保数据完整性,那么同时为列创建UNIQUE约束或PRIMARY KEY约束(如果确实是主码的话)是最佳的选择。

视图索引.

查询视图返回的结果集和查询基本表返回的结果集是一致的,实际上查询标准视图时,SQL Server内部都会进行视图消解,将其转换为对基本表的查询。对于标准视图而言,DD中仅仅保留其定义,每一次用户对视图进行操作时,才按照定义从基本表中取出数据,如此一来查询动态生成的结果集的开销就会很大,尤其是对那些复杂的视图而言。如果我们有对这类视图很大量的查询需求,就可以为这些视图创建唯一聚集索引来提升查询性能,称为视图索引,而拥有了索引的视图称为索引视图。对视图创建了唯一聚集索引之后,结果集将直接存储在数据库中,就像一个带有唯一聚集索引的基本表一样,有效改善了对于视图的查询性能。
和之前的索引一样,如果很少更新表中的数据,而有很大量的查询操作,则使用索引视图的效果极佳。反之,维护索引的开销就会抵消甚至反超使用索引视图带来的收益。

全文索引.

全文索引是目前搜索引擎的关键技术之一,试想在一个1M大小的文件中搜索一个词,可能需要几秒,一个100M大小的文件就可能需要几十秒。为加快此类检索的速度,出现了全文索引技术,也称作倒排文档。原理是 先定义一个词库,然后在文章中查找并存储每个词条出现的频率和位置,相当于对文件建立了一个以词库为目录的索引,这样查找每个词时就能很快定位到该词的位置。

创建索引.

SQL中提供语句CREATE INDEX来创建索引,我们首先给出 几个创建索引的例子,在叙述其语法格式。

【例】为表SC在列SNo和CNo上建立唯一索引。

CREATE UNIQUE INDEX SC_Index
ON SC(SNo,CNo) 

执行上述代码以后,为表SC创建了一个名为SC_Index的唯一索引,是SNo和CNo两个列的复合索引,即对SC表中的行按SNo递增排序,相同的SNo再按照CNo递增排序(默认为ASC递增)。由于有UNIQUE的限制,所以SNo+CNo的组合是唯一的,不会重复。

【例】为教师表T在TN上建立聚集索引。

CREATE CLUSTERED INDEX T_Index
ON T(TN)

创建索引的语法格式如下:

CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED] INDEX NAME_OF_INDEX
ON NAME_OF_TABLE|NAME_OF_VIEW(Col_1 ASC|DESC,Col_2 ASC|DESC,...)

当中UNIQUE表示唯一,CLUSTEREDNONCLUSTERED表示聚集和非聚集。

修改索引.

修改索引的命令是ALTER INDEX.
在这里插入图片描述
在这里插入图片描述

删除索引.

删除索引的语法格式如下,有两种格式:

DROP INDEX NAME_OF_TABLE|NAME_OF_VIEW.NAME_OF_INDEX

DROP INDEX NAME_OF_INDEX ON NAME_OF_TABLE|NAME_OF_VIEW

猜你喜欢

转载自blog.csdn.net/weixin_44246009/article/details/108068993