索引(index)是对数据库表的一个或多个列的值进行排序的结构,其主要目的是提高SQL Server系统的性能,加快数据的查询速度和减少系统的响应时间。
所以,索引就算加快检索表中数据的方法。
1. 索引概述
如果要在一本书中快速地查找所需的信息,可以利用目录中给出的章节页码快速地查找到其对应的内容,而不是一页一页地查找。
数据库中的索引1与书籍中的目录类似,也允许数据库应用程序利用索引迅速找到表中特定的数据,而不必扫码整个数据库。
在图书中,目录是内容和相应页码的列表清单。
在数据库中,索引就算表中数据和相应存储位置的列表。
索引是以表的字段列为基础而建立的一种数据库对象,是一种实现数据快速定位与加快数据访问速度的技术手段。
索引通过存储排序的索引关键字与表记录的物理空间位置,建立索引数据与物理数据间的映射关系,从而实现表记录的逻辑排序。
索引的优点如下:
- 大大加快数据的检索速度,这是创建索引最主要的原因
- 创建唯一性索引,保证表中每一行数据的唯一性
- 加速表和表之间的连接
- 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
- 查询优化器可以提高系统的性能,但它是依靠索引起作用的
另外,每个索引都会占用一定的物理空间,如果占用的物理空间过多,就会影响到整个SQL Server系统的性能。
2. 索引类型
SQL Server支持在表中任何列(包括计算列)上定义索引。
索引可以是唯一的,即索引列不会有两行记录相同,这样的索引称为唯一索引。
例如,如果在表中的”姓名”列上创建了唯一索引,则以后输入的姓名将不能同名。
索引也可以是不唯一的,即索引列上可以有多行记录相同。
如果索引是根据单列创建的,这样的索引称为单列索引,根据多列组合创建的索引则称为复合索引。
根据索引组织方式的不同,可以将索引分为聚集索引和非聚集索引。
2.1 聚集索引
聚集索引对表和视图进行物理排序,所以这种索引对查询非常有效,在表和视图中只能有一个聚集索引。
当建立主键约束时,如果表中没有聚集索引,SQL Server会用主键列作为聚集索引键。
可以在表的任何列或列的组合上建立索引,实际应用中一般为定义成主键约束的列建立聚集索引。
例如,汉语字段的正文就算一个聚集索引的顺序结构。
要查”大”字,就可以翻开字典的前几页,因为”大”的拼音是da,而按拼音排序字典是以字母a开头以z结尾的,那么”大”字就自然地排在字典的前部。
如果翻完了所有da读音的部分仍然找不到这个字,那么就说明字典中没有这个字。
同样,如果查”赵”字,可以将字典翻到最后部分,因为”赵”的拼音是zhao。
也就是说,字典的正文内容本身就算按照音序排列的,而”汉语拼音音节索引”就可以称为”聚集索引”。
2.2 非聚集索引
非聚集索引不会对表和视图进行物理排序。
如果表中不存在聚集索引,则表是未排序的。
在表或视图中,最多可以建立250个非聚集索引,或者249个非聚集索引和一个聚集索引。
查字典时,不认识的字,就不能按照上面的根据拼音的方法来查找。
可以根据”偏旁部首”来查。
如查”张”字,在查部首之后的检字表中”张”的页码是622页,检字表中”张”的上面是”弛”字,但页码却是60页,”张”的下面是”弟”字,页码是95页,正文中这些字并没有位于”张”字的上、下方。
所以,现在看到的、连续的”弛、张、弟”三字实际上就算它们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。
通过这种方式来找到所需要的字要两个过程,先找到目录中的结果,然后再翻到相应的页码。
这种目录纯粹是目录,正文纯粹是正文的排序方式称为”非聚集索引”。
聚集索引和非聚集索引都可以是唯一的索引。
因此,只要列中数据是唯一的,就可以在同一个表上创建一个唯一的聚集索引。
如果必须实施唯一性以确保数据的完整性,则应在列上创建唯一性或主键约束,而不要创建唯一索引。
创建主键或唯一性约束会在表中指定的列上自动创建唯一索引。
创建唯一性约束与手动创建唯一索引没有明显的区别,进行数据查询时,查询方式相同。
而且查询优化器不区分唯一索引没有明显的区别,进行数据查询时,查询方式相同,而且查询优化器不区分唯一索引是由约束创建还是手动创建的。
如果存在重复的键值,则无法创建唯一索引和主键约束或唯一性约束。
如果是复合的唯一索引,则该索引可以确保索引列中每个组合都是唯一的,创建复合唯一索引可为查询优化器提高附加信息,所以对多列创建复合索引时最好是唯一索引。
3. 创建索引
创建索引的方式主要有3种,分别是使用图形界面创建、使用T-SQL语句创建和间接创建。
3.1 使用图形界面创建索引
(1)在SSMS种点开要创建索引的表的树状结构,找到索引项,如下图所示
![](https://ichiblog.cn/wp-content/uploads/2024/12/图片-6-1024x817.png)
(2)右击”索引”项,在弹出的快捷菜单种选择”新建索引”命令,然后选择索引的类型。
进入”新建索引”窗口,如下图:
![](https://ichiblog.cn/wp-content/uploads/2024/12/图片-7.png)
在”索引名称”文本框中可以输入索引的名称,可以通过勾选”唯一”选项确定是否唯一值索引,单击”添加”按钮,弹出”选择列”对话框,如下图所示:
![](https://ichiblog.cn/wp-content/uploads/2024/12/图片-8.png)
选择某几列前的复选框,单击”确定”按钮即在这些列上添加了一个索引项,再单击”确定”按钮,索引创建完毕。
3.2 使用T-SQL语句创建索引
语法格式如下。
使用create index语句,既可以创建聚集索引,也可以创建非聚集索引。
它的语法格式如下:
CREATE [UNIQUE][CLUSTERED][NONCLUSTERED]
INDEX INDEX_NAME
ON TABLE_OR_VIEW_NAME(COLUMN[ASC|DESC][,...n])
其中,各参数说明如下:
- UNIQUE:用于指定为表或视图创建唯一索引,既不允许存在索引值相同的两行。省略表示非唯一索引。
- CLUSTERED:用于指定创建的索引为聚集索引。
- NONCLUSTERED:用于指定创建的索引为非聚集索引,为默认值。
- INDEX_NAME:索引的名称。索引名称在表或视图中必须唯一,但在数据库中不必唯一。索引名称必须符合标识符的规则。
- ASC|DESC:用于指定具体某个索引列以升序或降序方式排序。
举例:在student表中,根据年龄的升序和姓名的降序创建一个index_age_name的索引。
CREATE INDEX index_age_name ON STUDENT(age ASC,name DESC)
运行结果:
![](https://ichiblog.cn/wp-content/uploads/2024/12/图片-9-1024x367.png)
3.3 间接创建索引
当表中定义主键约束或唯一性约束时,索引自动被创建了,这种方式可以间接创建索引。
4. 查看索引
查看索引的方式主要有两种,分别是使用图形化界面和使用T-SQL语句。
4.1 使用图形化界面查看索引
利用SSMS选择要查看索引的表,右击打开表的设计界面,进入表的设计器界面,右击任意位置,在弹出的快捷菜单中选择”索引/键”命令,即可看到此表的所有索引信息。
![](https://ichiblog.cn/wp-content/uploads/2024/12/图片-10.png)
4.2 使用T-SQL语句查看索引
通过系统存储过程来查看索引的信息。
①使用存储过程sp_helpindex查看索引信息
查看student表的索引信息。
EXEC sp_helpindex STUDENT
运行结果如下:
![](https://ichiblog.cn/wp-content/uploads/2024/12/图片-11.png)
② 使用存储过程sp_help查看索引信息
查看student表的索引信息
EXEC sp_help STUDENT
运行结果如下:
![](https://ichiblog.cn/wp-content/uploads/2024/12/图片-12-1024x578.png)
从运行结果可以看出,sp_help查询的结果要比sp_helpindex查询的结果更加详细。
5. 删除索引
当一个索引不再需要时,可以将其从数据库中删除,以回收它当前使用的磁盘空间。
根据索引的创建方式,要删除的索引分为两类:
一类为创建表约束时自动创建的索引,必须通过删除主键约束或唯一性约束,才能删除约束使用的索引;
另一类通过创建索引的方式创建的独立于约束的索引,可以利用SSMS工具或drop index语句直接删除。
使用drop index语句删除独立于约束的索引的语法结构如下:
DROP INDEX 表名,索引名|视图名,索引名[,..n]
例子:删除student表上的index_age_name索引。
DROP INDEX STUDENT.index_age_name
运行结构如下:
![](https://ichiblog.cn/wp-content/uploads/2024/12/图片-13.png)