1.索引的简介:
索引分为聚集索引和非聚集索引,数据库中的索引类似于一本书的目录,在一本书中通过目录可以快速找到你想要的信息,而不需要读完全书。
索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 。
但是索引对于提高查询性能也不是万能的,也不是建立越多的索引就越好。索引建少了,用 WHERE 子句找数据效率低,不利于查找数据。索引建多了,不利于新增、修改和删除等操作,因为做这些操作时,SQL SERVER 除了要更新数据表本身,还要连带立即更新所有的相关索引,而且过多的索引也会浪费硬盘空间。
2.索引的分类:
索引就类似于中文字典前面的目录,按照拼音或部首都可以很快的定位到所要查找的字。
- 唯一索引(UNIQUE):每一行的索引值都是唯一的(创建了唯一约束,系统将自动创建唯一索引)
- 主键索引:当创建表时指定的主键列,会自动创建主键索引,并且拥有唯一的特性。
- 聚集索引(CLUSTERED):聚集索引就相当于使用字典的拼音查找,因为聚集索引存储记录是物理上连续存在的,即拼音 a 过了后面肯定是 b 一样,聚集索引一个表只能有一个。
- 非聚集索引(NONCLUSTERED):非聚集索引就相当于使用字典的部首查找,非聚集索引是逻辑上的连续,物理存储并不连续,非聚集索引一个表可以存在多个。
非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点:
1. 基础表的数据行不按非聚集键的顺序排序和存储。
2. 非聚集索引的叶层是由索引页而不是由数据页组成。
3.创建索引:
--创建聚集索引 create clustered index Clu_Index on Student(S_StuNo) with (drop_existing=on) --创建非聚集索引 create nonclustered index NonClu_Index on Student(S_StuNo) with (drop_existing=on) --创建唯一索引 create unique index NonClu_Index on Student(S_StuNo) with (drop_existing=on)
- 如果指定DROP_EXISTING选项,那么如果之前已经存在同名索引将在构造新索引之前被删除。
- 当 创建索引时,如果未指定 clustered 和 nonclustered,那么默认为 nonclustered。
- 聚集索引不能创建包含非键列的索引。
4.修改索引:
--修改索引语法 ALTER INDEX { 索引名| ALL } ON <表名|视图名> { REBUILD | DISABLE | REORGANIZE }[ ; ]
- REBUILD:表示指定重新生成索引。
- DISABLE:表示指定将索引标记为已禁用。
- REORGANIZE:表示指定将重新组织的索引叶级。
5.禁用索引:
--禁用名为 NonClu_Index 的索引 alter index NonClu_Index on Student disable
6.删除、查看和更新索引:
--查看指定表 Student 中的索引 exec sp_helpindex Student --删除指定表 Student 中名为 Index_StuNo_SName 的索引 drop index Student.Index_StuNo_SName --检查表 Student 中索引 UQ_S_StuNo 的碎片信息 dbcc showcontig(Student,UQ_S_StuNo) --整理 Test 数据库中表 Student 的索引 UQ_S_StuNo 的碎片 dbcc indexdefrag(Test,Student,UQ_S_StuNo) --更新表 Student 中的全部索引的统计信息 update statistics Student
7.使用索引的代价:
- 索引需要占用数据表以外的物理存储空间
- 创建索引和维护索引要花费一定的时间
- 当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
8.创建索引的原则:
- 避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。而对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。
- 在条件表达式中经常用到的、不同值较多的列上建立索引,在不同值少的列上不要建立索引。
- 在频繁进行排序或分组(即进行 GROUP BY 或 ORDER BY 操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。
- 在选择索引键时,尽可能采用小数据类型的列作为键以使每个索引页能容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必需遍历的索引页面降低到最小,此外,尽可能的使用整数做为键值,因为整数的访问速度最快。