索引(Index)好比书的目录,当进行检索时不必扫描整个表,就可以迅速的找到表中的数据。
书要制作目录可以方便查找,但也需要纸张来存储目录信息,如果增加或删除了书的内容,那么
目录必定也要做修改,索引与之类似,可以快速检索,但也需要一定的内存开销以及维护开销。
首先先解释下索引是如何快速找到数据的?
索引是一个单独的、物理的分散存储数据库结构。它是针对一个表建立的,每个索引
页面中的行都含有逻辑指针,指向数据库表中的物理位置。在进行检索的时候,总是先
检索索引页,找到指向所需数据的指针,然后通过该指针找到数据页面读取数据,提高查询效率。
建立索引页必然要占用一部分内存,同时增加、删除、修改的时候也要花费时间去维护索引,
所以选择合适的列建立索引是很必要的。
那么该选择怎样的列建立索引呢?
1、主键列:存取最常用的列便是主键。
2、外键列:外键通常要与其它表进行关联查询,将其设置为索引,可以更加快速的进行连接
3、经常被作为条件检索的列和按排序频繁检索的列。
选择好列还要遵循一定的建立索引原则,如下:
1、数据量很少的表不要建立索引,因为数据太少,索引的效果不明显,还得花时间维护。
2、对检索的字段有很多数据值或空值,为其建立索引,可以大大提高检索速度。
3、在对表中的数据进行大量更新时最后先删除索引在更新,然后在建立索引。
4、在模糊查询时尽量不要使用like '%某某%' ,而使用like '某%'
5、少用全表索引
知道原则了,那么开始建立索引了,一般索引分为聚集索引(簇索引)和非聚集索引(非簇索引),
其建立都是用CREATE INDEX,指示建立聚集索引时要显示声明CLUSTERED。
例如对StudentInfo表中的No列和Name列建立降序非聚集索引或聚集索引,可以这样写:
CREATE [CLUSTERED] INDEX indexName_stuInfo ON StudentInfo(No,Name DESC)
[CLUSTERED]表示可选,选择则建立聚集所以。
注意:聚集索引一张表只能建一个,故在对一张表建立聚集索引前要先删除原来的聚集索引。
如:IF EXISTS(SELECT NAME FROM SYS.INDEXES WHERE NAME ='indexName_stuInfo')
DROP INDEX StudentInfo.indexName_stuInfo
GO
CREATE CLUSTERED INDEX indexName_stuInfo ON StudentInfo(No,Name DESC)
GO
*******************************下回介绍维护索引********************************************