什么是索引,有什么优点?
答:索引象书的目录类似,索引使数据库程序无需扫描整个表,就可以在其中找到所需要的数据,索引包含了一个表中包含值的列表,其中包含了各个值的行所存储的位置,索引可以是单个或一组列,索引提供的表中数据的逻辑位置,合理划分索引能够大大提高数据库性能。
索引的概念
索引的用途
:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法。
索引是什么
:数据库中的索引类似于一本书的目录,在一本书中使用目录可以快速找到你想要的信息,而不需要读完全书。在数据库中,数据库程序使用索引可以重啊到表中的数据,而不必扫描整个表。书中的目录是一个字词以及各字词所在的页码列表,数据库中的索引是表中的值以及各值存储位置的列表。
索引的利弊
:查询执行的大部分开销是I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读取表的每一个数据页,如果有索引指向数据值,则查询只需要读少数次的磁盘就行啦。所以合理的使用索引能加速数据的查询。但是索引并不总是提高系统的性能,带索引的表需要在数据库中占用更多的存储空间,同样用来增删数据的命令运行时间以及维护索引所需的处理时间会更长。所以我们要合理使用索引,及时更新去除次优索引。
语法:
CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED ] INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) [with[PAD_INDEX][[,]FILLFACTOR=fillfactor] [[,]IGNORE_DUP_KEY] [[,]DROP_EXISTING] [[,]STATISTICS_NORECOMPUTE] [[,]SORT_IN_TEMPDB] ] [ ON filegroup ]
CREATE INDEX
命令创建索引各参数说明如下:
UNIQUE
:用于指定为表或视图创建唯一索引,即不允许存在索引值相同的两行。CLUSTERED
:用于指定创建的索引为聚集索引。NONCLUSTERED
:用于指定创建的索引为非聚集索引。index_name
:用于指定所创建的索引的名称。table
:用于指定创建索引的表的名称。view
:用于指定创建索引的视图的名称。ASC|DESC
:用于指定具体某个索引列的升序或降序排序方向。Column
:用于指定被索引的列。PAD_INDEX
:用于指定索引中间级中每个页(节点)上保持开放的空间。FILLFACTOR = fillfactor
:用于指定在创建索引时,每个索引页的数据占索引页大小的百分比,fillfactor的值为1到100。IGNORE_DUP_KEY
:用于控制当往包含于一个唯一聚集索引中的列中插入重复数据时SQL Server所作的反应。DROP_EXISTING
:用于指定应删除并重新创建已命名的先前存在的聚集索引或者非聚集索引。STATISTICS_NORECOMPUTE
:用于指定过期的索引统计不会自动重新计算。SORT_IN_TEMPDB
:用于指定创建索引时的中间排序结果将存储在 tempdb 数据库中。ON filegroup
:用于指定存放索引的文件组。
索引的创建与销毁
CREATE INDEX 关键字/DROP INDEX
基本语法:
CREATE INDEX index_name ON table_name (列名1,列名2,......);
示例:
学生信息表:
招生信息表:
院系信息表:
示例1:为StudentInfo表中的sname字段创建非簇索引
CREATE INDEX Name_Index ON StudentInfo(sname)
查询:
SELECT sname FROM StudentInfo
结果:
强制使用Name_Index索引:
SELECT * FROM StudentInfo WITH (INDEX(Name_Index))
使用ORDER BY关键字
SELECT * FROM StudentInfo ORDER BY sname
虽然从表面上看,SELECT * FROM ...ORDER BY 得到了相同的结果,但是,二者从本质上有很大的区别。ORDER BY关键字在每次查询数据时,都要对数据进行排序。而创建索引后,数据库系统实际上创建了一个索引结构体,用户每次使用查询数据时,都是用相同的索引结构,从而节省了时间。
复合索引
CREATE INDEX SexName_Index ON StudentInfo(sex,sname);
强制使用该索引
SELECT * FROM StudentInfo WITH (INDEX(SexName_Index))
在创建多字段索引时,各字段的排列顺序决定了其优先级,排名越靠前,具有越高的优先级。
唯一索引:指不允许在两行中存在相同的索引值
CREATE UNIQUE INDEX Sno_Index ON StudentInfo (sno DESC)
强制使用该索引
SELECT * FROM StudentInfo WITH (INDEX(Sno_Index))
具有重复值字段的唯一性索引
CREATE UNIQUE INDEX Address_Index ON StudentInfo (address)
结果:
簇索引
CREATE CLUSTERED INDEX Snameclester_Index ON StudentInfo (sname) DROP INDEX StudentInfo.Snameclester_Index CREATE CLUSTERED INDEX SexAddrssClustered_Index ON StudentInfo(sex,address)