在关系数据库中,索引是一种单独的,物理的对数据库表中一列或者多列的值进行排序的一种存储结构。他是某个表中的一列或者若干列值的集合和相应的指向表中物理标识这些值得数据页的逻辑指针清单。
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值得指针,然后根据指定的排序顺序对这些指针排序。数据库使用索引找到特定值,然后顺着指针找到包含该值的行,这样可以快速访问数据库表中的特定信息。
当表中有大量记录时,若要对表进行查询
- 第一种检索方式是全表搜索,将数据库表文件分块,逐个读到内存,将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘IO操作。
- 第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID快速找到表中对应的记录。
关于建索引的列需要唯一性约束。
而索引的缺点
- 索引本身要占用数据表以外的额外存储空间,带索引的表在数据库中需要更多的物理存储空间
- 创建索引与维护索引需要花费一定的时间,这种时间的消耗随着数据量的增长而相应的增加。当对表数据进行增删改等操作时,索引也需要做相应的更新,这显然会降低数据的维护速度,增加数据操纵的时间。
索引分类
两种最基本的索引- 聚集索引
- 非聚集索引
此外还有
- 唯一索引
- 包含列索引
- 索引视图
- 全文索引
- 空间索引
- 筛选索引
- XML索引
聚集索引
在聚集索引(也称为簇索引或簇集索引)中,表中的行的物理存储顺序和索引顺序完全相同,(类似图书目录和正文内容之间的关系)。聚集索引对表的物理数据页按列进行排序,然后重新存储到磁盘上。由于聚集索引对表中的数据进行了一一排序,因此使用聚集索引查找数据很快。
但是由于聚集索引将表的所有数据完全重新排列,它需要的空间也特别大,大概相当于表中数据所占空间的120%,由于表的数据行只能以一种排序方式存储在磁盘上,所以一个表只能有一个聚集索引。为数据建立聚集索引后,改变了表中的数据行存储的物理顺序。
非聚集索引
非聚集索引(也称为非簇索引或非簇集索引),具有与表的数据行完全分离的结构,使用非聚集索引不用将物理数据页中的数据按列排序。非聚集索引存储了组成非聚集索引的关键字和一个指针,指针指向数据页中的数据行。该行具有与索引键值相同的列值。非聚集索引不会改变数据行的物理存储顺序,因而一个表可以有多个非聚集索引
默认情况下,CREATE INDEX语句建立的索引就是非聚集索引。理论上讲,一个表最多建立249个非聚集索引,而只有一个聚集索引。
唯一索引
为了确保表或者视图的每一行在某种程度上是唯一的,可以使用唯一索引,也就是说索引值是唯一的。创建数据表时如果设置了主键,则SQL Server 2008就会默认建立一个唯一索引。由于唯一索引是从索引值是否唯一的角度来定义的。所以它是聚集还是非聚集都可以
包含列索引
在SQL Server中索引列的数量(最多16个)和字节总数(最大900字节)是受限制的。使用包含列索引,可以通过将非键列添加到非聚集索引的叶级来扩充其功能,创建覆盖更多查询的非聚集索引。
视图索引
视图索引是为视图创建的索引,其存储方式与带聚集索引的表的存储方式相同。
全文索引
全文索引,是一种特殊类型的基于标记的功能性索引,由SQL Server全文引擎(msftesql)服务创建的和维护。其目的是帮助用户在字符串数据库中检索复杂的词语
空间索引
空间索引是对包含空间数据的表列(“空间列”)定义的。每个空间索引指向一个有限的空间。利用空间索引可以更高效地对geometry数据类型的列中的空间对象(空间数据)执行某些操作。空间索引可以减少需要应用开销相对较大的空间操作的对象数。
筛选索引
筛选索引是一种经过优化的非聚集索引。尤其适用于从定义完善的数据子集中选择数据的查询。筛选索引使用筛选谓词对表中的部分进行数据索引。与全表索引相比,设计良好的筛选索引可以提高查询性能,减少索引维护开销并可降低索引存储开销
XML索引
XML索引是XML数据关联的索引形式,是XML二进制BLOB的已拆分持久表示形式,可分为主索引和辅助索引。
索引与约束的关系
对于列定义PRIMARY KEY约束和UNIQUE约束时,会自动创建索引。
PRIMARY KEY约束和索引
建表时将一个特定列标识为主键,则数据库会自动为该列创建PRIMARY KEY约束和唯一聚集索引。
UNIQUE约束和索引
在默认情况下,创建UNIQUE约束时。数据库会自动为该列创建唯一非聚集索引。
当用户从表中删除主键约束或唯一约束时。创建在这些约束列上的索引也会被自动删除。
独立索引
使用CREATE INDEX创建的索引就是独立与约束的索引。
创建索引
使用CREATE INDEX可以创建聚集索引,也可以创建非聚集索引。
CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]
INDEX <索引名>
ON <表名或者视图名>(<列名> [ASC|DESC][,...n])
UNIQUE:用于指定为表或者视图创建唯一索引,即不允许存在索引值相同的两行。省略表示非唯一索引。 CLUSTERED:用户指定创建的索引为聚集索引 NONCLUSTERED:用户指定创建的索引为非聚集索引,默认就是这个。 这两玩意可以在列约束上使用,PRIMARY KEY和UINQUE
查看索引
[EXECUTE|EXEC] sp_helpindex <表或视图名>
重命名索引
sp_rename '表名或视图名.原索引名','新索引名'
删除索引
要删除的索引分为两类:一类为创建表约束时,自动创建的索引,必须通过删除PRIMARY KEY或者UNIQUE约束,才能删除约束使用的索引。另一类通过创建索引的方式创建的独立于约束的索引,可以通过DROP INDEX语句删除
DROP INDEX <表名或视图名>.<索引名>[,...n]