学习目标
- 理解索引的概念
- 创建索引
- 删除索引
- 索引设计的基本原则
索引的概念
SQL Server的索引是对数据库表中一个或多个列的值进行排序的结构,可以加快数据的查询速度,减少系统的响应时间。
索引分类
按照索引组织方式的不同,可以将索引分为聚集索引和非聚集索引。
聚集索引
聚集索引确定表中数据的物理顺序,当以某字段作为关键字建立聚集索引时,表中数据以该字段作为排序依据。即索引的顺序决定了表中行的存储顺序。因此,每个表只能有一个聚集索引。
例如,可以将图书馆中的书按照书名进行排序,建立一个字母开头的目录,a开头的书放在书架的第一排,b开头的书放在第二排,这就是一个聚集索引。
非聚集索引
非聚集索引并不在屋里上排列数据,即索引中的逻辑顺序并不等同于表中行的屋里顺序,索引仅仅记录指向表中行的位置的指针(位置信息),这些 指针本身是有序的,通过这些指针可以在表中快速地定位数据。
例如,还是图书馆的例子,如果希望按作者去查找的话,那么需要再编写一个目录,记录某某作者的书分别在第几排,这就是一个非聚集索引。
聚集索引和非聚集索引的区别
聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。
创建索引
在T-SQL中可以使用CREATE INDEX
创建索引,语法如下:
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX 索引名称
ON 表名或视图名(列1, [列2,...])
其中个参数的含义如下:
- UNIQUE,为表或视图创建唯一索引
- CLUSTERED,表示创建聚集索引,决定了表中对应行的物理顺序
- NONCLUSTERED,创建非聚集索引
练习1
对students表的sno创建聚集索引
CREATE UNIQUE CLUSTERED INDEX IX_students_sno ON students (sno)
练习2
对students表的sname创建非聚集索引
CREATE INDEX IX_students_sname ON students (sname)
删除索引
在T-SQL中可以使用DROP INDEX
创建索引,语法如下:
DROP INDEX 表名或视图名.索引名称
练习
删除students表的索引IX_students_sname
DROP INDEX students.IX_students_sname
索引设计原则
在使用索引前,应知道以下问题:
- 一个表如果建有大量索引,会影响INSERT、UPDATE和DELETE语句的性能,因此应避免对经常更新的表进行过多的索引
- 使用多个索引可以提高更新少而数据量大的查询性能
因此在设计索引时,应该遵循下面的原则
- 定义主键的数据列一定要建立索引
- 定义有外键的数据列一定要建立索引
- 对于经常查询的数据列最好建立索引
- 对于需要在指定范围内的快速或频繁查询的数据列
- 经常用在WHERE子句中的数据列
- 经常出现在关键字order by、group by、distinct后面的字段。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致,否则索引不会被使用
- 对于那些查询中很少涉及的列,重复值比较多的列不要建立索引
- 对于定义为text、image和bit的数据类型的列不要建立索引
- 对于经常存取的列避免建立索引
- 限制表上的索引数目。对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。索引虽说提高了访问速度,但太多索引会影响数据的更新操作。
- 对复合索引,按照字段在查询条件中出现的频度建立索引。在复合索引中,记录首先按照第一个字段排序。对于在第一个字段上取值相同的记录,系统再按照第二个字段的取值排序,以此类推。因此只有复合索引的第一个字段出现在查询条件中,该索引才可能被使用,因此将应用频度高的字段,放置在复合索引的前面,会使系统最大可能地使用此索引,发挥索引的作用。
总结
- 理解索引的概念
- 创建索引
- 删除索引
- 索引设计的基本原则