博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大型数据库技术复习 —— 索引
阅读量:503 次
发布时间:2019-03-07

本文共 1809 字,大约阅读时间需要 6 分钟。

简介

  • 数据库中的索引是某个表中一列或者若干列值的集合 和 指向表中物理标识这些值的数据页的逻辑指针清单。

索引的作用

  • 通过创建唯一索引,可以保证数据记录的唯一性
  • 可以大大加快数据检索速度。
  • 可以加速表与表之间的连接.
  • 在使用ORDER BYGROUP BY子句中进行检索数据时,可以显著减少查询中分组和排序的时间。
  • 使用索引可以在检索数据的过程中使用查询优化器,提高系统性能。

聚集索引

  • 聚集索引对表的物理数据页中的数据按列进行排序,然后再重新存储到磁盘上,即聚集索引与数据是混为一体的,它的叶节点中存储的是实际的数据。
  • 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。
  • 应当在创建非聚集索引之前创建聚集索引。
  • 聚集索引在 sysindexes 内有一行,其 indid = 1

在这里插入图片描述

非聚集索引

  • 非聚集索引的叶节点存储了组成非聚集索引的关键字值和行定位器。
  • 如果创建索引时没有指定索引类型,默认情况下为非聚集索引;
  • 每个表最多可以创建249个非聚集索引;
  • 最好在唯一值较多的列上创建非聚集索引;
  • 应在联接和分组操作中使用的列上创建多个非聚集索引,在任何外键列上创建一个聚集索引。
    在这里插入图片描述

主键索引和非主键索引

  • 主键索引:主键创建会自动创建聚集索引。
  • 非主键索引:在非主键的属性列上创建的索引,这些索引一般都是非聚集索引。

唯一索引和非唯一索引

  • 唯一索引:索引列中不包含重复值。只有当唯一性是数据本身特征时,指定唯一索引才有意义。
  • 非唯一索引:非设置PRIMARY KEY约束或UNIQUE约束时的索引。

单列索引和复合索引

  • 单列索引:指对表中单个列建立索引。
  • 复合索引:一个索引中包含了一个以上的列的索引。

创建索引

  • 利用T-SQL语句中的CREATE INDEX命令创建索引。
    语法格式:
CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED ]INDEX 索引名 ON  数据表名|视图名( 字段名 [ ASC | DESC ] [ ,...n ] ) [WITH	[PAD_INDEX][[,]FILLFACTOR=填充因子][[,]IGNORE_DUP_KEY][[,]DROP_EXISTING][[,]STATISTICS_NORECOMPUTE][[,]SORT_IN_TEMPDB]][ ON 文件组名]
  • 参数说明

    (1)UNIQUE:用于指定为表或视图创建唯一索引,即不允许存在索引值相同的两行。
    (2)CLUSTERED:用于指定创建的索引为聚集索引。
    (3)NONCLUSTERED:用于指定创建的索引为非聚集索引。
    (4)ASC|DESC:用于指定具体某个索引列的升序或降序排序方向。
    (5)PAD_INDEX:用于指定索引中间级中每个页(节点)上保持开放的空间。必须和填充因子同时使用。
    (6)FILLFACTOR =填充因子:用于指定在创建索引时,每个索引页的数据占索引页大小的百分比,fillfactor的值为1到100。
    (7)IGNORE_DUP_KEY:用于控制当往包含于一个唯一聚集(注:有误,非聚集索引也可使用此选项)索引中的列中插入重复数据时SQL Server所作的反应。当使用该选项,表示当插入或更新记录时,忽略重复键值。
    (8)DROP_EXISTING:用于指定应删除并重新创建已命名的先前存在的聚集索引或者非聚集索引。
    (9)STATISTICS_NORECOMPUTE:用于指定过期的索引统计不会自动重新计算。
    (10)SORT_IN_TEMPDB:用于指定创建索引时的中间排序结果将存储在 tempdb 数据库中。

  • 例如:

USE 教学管理GOCREATE UNIQUE INDEX IX_学号_开课号 ON 选课表(学号 DESC,开课号 ASC)    WITH(    PAD_INDEX=ON,                          	--保持索引开放的空间    FILLFACTOR=90,                  		--填充因子90    IGNORE_DUP_KEY=ON,                   	--忽略重复键值    DROP_EXISTING=ON)                   	--如果存在索引则删除

删除索引

DROP INDEX 表名.索引名[,…n]

转载地址:http://synjz.baihongyu.com/

你可能感兴趣的文章