SQL Server 2005系列教学_索引
索引
我们主要讲
索引的概念和作用
索引的类型
使用SSMS图形界面创建和管理索引
使用T-SQL语句创建和管理索引
选择和维护索引
索引是信赖于表建立的,也就是说没有单独的索引,只有建立在表上的索引。一个表的存储由两部分组成的:一部分用来存放表的数据页面,另一部分存放索引页面。索引就存放在索引页面上,我们一般是先查索引页面,从索引页面上找到我们所需要的信息后,再到数据页面上去找,并且索引页面相对于数据页面来说小得多。当我们进行数据检索时,系统先搜索索引页面,从中找到所需数据的指针,再直接通过指针从数据页面中取数据。从某种程序上可以把数据库看作一本书,把索引看作是书的目录,通过目录查找书的中的信息显然比没有目录的书方便快捷。
作用:在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。利用索引可以大大提高系统的性能,表现在:
1. 通过创建唯一索引,可以保证数据记录的唯一性。如,序号,编号等等,不会有重复的。
2. 大大加快数据检索速度。小型的表不明显,甚至会降低,但如果有几十万条时,速度比没有建索引时要快的多。
3. 加速表与表之间的连接。建立过索引之后,表与表之间的连接也会变得很快。
非常,可以使用性能大大提高,但也有
缺点:
1、 占用储存空间,相对于数据部分来说是相当小的,但不等于它不占用空间,那如果你要是不建立索引,这部分空间是可以省下来的。但到底是要空间还是要性能你看着办。当你的表比较大的时候,字段比较多的时候,那么你的WHERE子句所包含的条件也就越多,那么你就可能建立不止一个索引。那么这样的话,你建的索引越多,空间占用就越大。
2、 在表中插入或更新表中数据时,将有额外的操作来维护索引,那如果没有在表中建立索引的时候,如果向表中插入数据时,只需向数据表插入即可,即维护一张表就OK了,那现在建立了索引,当你在向表中插入记录里,系统还向更改索引表的内容,即多维护一张表。
3、 过多的索引起反作用。那有的同学要说了,索引能提高效率,那我每一个字段我都来一个索引,不是很好吗?正因为,它占用的空间,系统要维护的表多了,所以当索引太多的时候,反而性能会下降。
下面我们看一下索引的分类:
聚集索引:对表中的物理数据页中的数据按列进行排序,然后再重新存储到磁盘上。换句话说,如果在一个表中建立了聚集索引,由表中的数据页会按照该索引的顺序来存放。
优点:查找数据速度快
缺点:完全重排数据,要相当于数据所占用空间的120%
注意:
1.由于一个表只能有一种实际的存储顺序,因此,一个表只能有一个聚集索引。如一个表有姓名,性别,身份证号,如我在身份证号上做了一个聚集索引,就会按顺序,那如果是姓名呢?同理。。。顺序就变了,也就是说索引变了,存储顺序就变了,只能有一个,也可以不建。
2.创建非聚集索引之前要先创建聚集索引
3.关键值的唯一性使用unique来维护
4.保证有足够的临时空间来创建聚集索引 在TEMPDB数据库
非聚集索引:具有完全独立于数据行的结构。使用非聚集索引不用将物理数据页中的数据按列排序。通谷地说,不会影响数据表中记录的实际存储顺序。因此可以在一个表中创建多个非聚集索引。
非聚集索引需要更多的空间,检索效率也较低。因为聚集索引是和表的物理顺序是一致的,所以速度要快,但非聚集索引就不是了,它是和表的物理顺序是无关的,所以速度要慢。
一个表中除建立一个聚集索引外,还可以建立249个非聚集索引。一共是250个
刚才我们介绍了索引的分类,从索引会不会影响物理顺序的更改上看,我们可以分为聚集索引和非聚集索引。索引的分类还可以有其他方式,不管是聚集索引还是非聚集索引,根据索引键值是否重复,可以判定为是否为唯一索引;根据索引字段的组成情况,可以判定是否为组合索引。我们具体来看一下到底什么是唯一索引什么是组合索引。
下面的表总结了何时使用聚集索引或非聚集索引(很重要):
动作描述 |
使用聚集索引 |
使用非聚集索引 |
列经常被分组排序 |
应 |
应 |
Where条件的列 |
应 |
不应 |
一个或极少不同值 |
不应 |
不应 |
小数目的不同值 |
应 |
不应 |
大数目的不同值 |
不应 |
应 |
频繁更新的列 |
不应 |
应 |
外键列 |
应 |
应 |
主键列 |
应 |
应 |
频繁修改索引列 |
不应 |
应 |
唯一索引:基于字段或字段的组合,且字段或字段值必须是唯一的,即不允许重复。
若希望在表中创建唯一索引,则该字段或字段的组合的值在表中必须具有唯一性,即表中任何两条记录的索引值都不能相同。
同样,若表中基于某个字段或字段组合存在两条以上的记录中有相同的值,将不能基于该字段或字段组合创建唯一索引。任何两条记录的索引值不能相同。可以是对一个字段也可以是多个字段,如姓名加序号,姓名加序号两个字段的组合建立一个索引。
注意:建立唯一索引的字段最后也设置为not null,因为两个null值也被认为是重复的字段值。
向表中添加记录或修改记录时,系统将检查添加的记录或修改后的记录是否会造成唯一索引键值的重复。若造成唯一索引键值的重复,系统将拒绝执行该操作。
复合索引:
若基于多个字段的组合创建索引,则称该索引为复合索引。
注意:符合索引既可以是唯一索引,也可以不是唯一索引。即使是唯一索引,这个字段的组合的取值是不能重复,但是单独的字段值可以重复。
SQL SERVER 2000在执行查询时,查询优化器会对可用的数据检索方法的成本进行评估,从中选择最有效的方法因此,只要数据表中存在索引,SQL SERVER 就会使用索引进行查询。若不使用索引,SQL SERVER将执行整表扫描。若使用索引,SQL SERVER将会查找查询所需的行的存储位置,并直接提取出所需的行。也就是先找索引页,再找数据页。
刚才所讲的是跟索引相关的理论,下面咱们来看一下和索引相关的操作。
创建索引
利用索引向导来创建:
利用SSMS图形界面直接创建
利用SQL命令。
新建表时创建 主键约束或是unique约束时,系统会基于添加约束的字段自动创建一个索引。
唯一约束字段:
若为数据表中的某一字段设置了唯一性约束,系统将基于这个字段自动创建一个索引,以确保该字段的唯一性。这个索引可以是聚集的,也可以是非聚集的。取决于是否使用clustered关键字。若使用了clustered关键字,则该索引是聚集的;否则就是非聚集的。
我们可以使用存储过程sp_helpindex来查看表的所有索引信息
格式:
Sp_helpindex ‘名称’
还可以使用 sp_rename来更改索引的名称。
sp_rename 'ix_yuangong','ix_yg'
例子:可以找一个没有主键约束也没有UNIQUE约束的表,使用以上两个存储过程来操作,并建立一个UNIQUE约束以后再查看
在创建表的时候,将产品名称设置为聚集的唯一索引
Create table product
(产品编号 int,
产品名称 varchar(10) unique clustered)
sp_helpindex product
可以看出有clustered,就是聚集索引!
索引选择:
在表中哪些列适宜建立索引呢?
适宜建立索引的列包括:主键字段,外键字段,要排序的列,要分组的列,以及WHERE子句中精确指定的列 (=)
Where name like ‘张%’ 可搜索的。不需要整个表搜索
Where name like ‘%张%’ 不可搜索的。需要遍历整个表。
不适合建立索引的列:
列的类型是文本,图像或位
列的唯一性不强,如性别 (十万条)
列的范围太多,不能有效索引