索引的优点:
索引类似于字典的目录,用于快速定位到你要查找的数据,这样你就不用一页一页去查找,提高了查询性能。索引的基本目的是在大量数据中找寻少量数据,把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以找到需要的数据了。例如:数据库中有20000条记录,现在要执行这样一个查询: SELECT * FROM tableName WHERE num=10000。如果没有索引,必须遍历整个表,直到num=10000的这一行为止;如果在num列上创建索引,SQL Server不需要任何扫描,直接在索引里面找10000,就可以得知这一行的位置。可见,索引的建立可以加快数据的查询速度
索引的缺点:
但是索引对于提高查询性能也不是万能的,也不是建立越多的索引就越好。索引建少了,用WHERE子句找数据效率低,不利于查找数据。索引建多了,不利于新增、修改和删除等操作,因为做这些操作时,SQL SERVER除了要更新数据表本身,还要连带地立即更新所有的相关索引,而且过多的索引也会浪费硬盘空间。索引字段的值重复性越低越好,用来作索引的数据域键值愈小愈好,这样分页就可以存更多的键值记录
微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)
聚集索引:典型的就是新华字典的正文就是一个聚集索引。正文本身就是按照一定的顺序排列的,例如我查 “微”,很自然的就从最前面翻到以字幕w开头的地方开始查询,直到w开头的查找结束,如果没有,则这个字就没有被收录。我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。聚集索引指的是数据表本身就是索引的一部分,数据表本身就是聚集索引的子叶层,整个数据表的摆放顺序是按照你选定的键值由小到大排序(或由大到小),因为数据表内实际摆放数据的方式只能遵循一种顺序,所以一个数据表只能有一个聚集索引,聚集索引的平均大小大约为表大小的 5%左右
最重要的,最常被用户作为查询,排序条件的适合建立聚集索引,在建立聚集索引之后,SQL SERVER会重新组织数据页,让其中的数据行按照聚集索引中键值的顺序存储
非聚集索引:
如果您碰到一个不认识的字,不知道它的发音,这时候需要去根据“偏旁部首”在检字表中查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。它需要两个过程,先找到目录中的结果,然后 再翻到您所需要的页码。我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引。
非聚集索引是完全独立于数据表之外的结构,所以不会影响数据行的顺序,非聚集索引具有完全独立于数据行的结构,使用非聚集索引不用将物理数据页中的数据按列排序,非聚集索引包含索引键值和指向表数据存储位置的行定位器。可以对表或索引视图创建多个非聚集索引。通常,设计非聚集索引是为了改善经常使用的、没有建立聚集索引的查询的性能。
查询优化器在搜索数据值时,先搜索非聚集索引以找到数据值在表中的位置,然后直接从该位置检索数据。这使得非聚集索引成为完全匹配查询的最佳选择,因为索引中包含搜索的数据值在表中的精确位置的项。
具有以下特点的查询可以考虑使用非聚集索引:
(1).使用JOIN或者GROUP BY子句,应为连接和分组操作中所涉及的列创建多个非聚集索引,为任何外键创建一个聚集索引.
(2).包含大量唯一值的字段。
(3).不返回大型结果集的查询。创建筛选索引以覆盖从大型表中返回定义完善的的行子集的查询。
(4).经常包含在查询的搜索条件(如返回完全匹配的WHERE子句)中的列。
建立索引的原则:
索引设计不合理或者缺少索引都会对数据库和应用程序的性能造成障碍,高效的索引对于获得良好的性能非常重要。设计索引时,应该考虑以下原则:
(1).索引并非越多越好,一个表中如果有大量的索引,不仅占用大量的磁盘空间,而且会影响INSERT、DELETE、UPDATE等语句的性能。因为当表中数据更改的同时,索引也会进行调整和更新。
(2).避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。而对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。
(3).数据量小的表最好不要使用索引,由于数据较少,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。
(4).在条件表达式中经常用到的、重复数据较少的列上建立索引,重复数据较多的列上不要建立索引、比如在学生表的【性别】字段上只有【男】或【女】两个不同值,因此就无需建立索引,如果建立索引,不但不会提高查询效率,反而会严重降低更新速度。
(5).当唯一性是某种数据本身的特征时,指定唯一索引,使用唯一索引能够确保定义的列的数据完整性,提高查询速度。
(6).在频繁进行排序或分组(即进行GROUP BY 或ORDER BY操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引
其他索引:索引视图,全文索引,空间索引,筛选索引等
索引练习:
--索引 --创建teacher表 create database sample_db; CREATE TABLE teacher( t_id int IDENTITY(1,1), t_name varchar(20), t_phone varchar(11), t_gender char(2) ) --【例1】在teacher表中的t_phone列上,创建一个名称为Idx_phone的唯一聚集索引, --降序排列,填充因子为30%,输入语句如下: CREATE UNIQUE NONCLUSTERED INDEX Idx_phone ON teacher (t_phone DESC) WITH FILLFACTOR=30; --【例2】在teacher表中的t_name和t_gender列上,创建一个名称为Idx_nameAndgender的 --唯一非聚集组合索引,升序排列,填充因子为10%。如下: CREATE UNIQUE NONCLUSTERED INDEX Idx_nameAndgender ON teacher(t_name,t_gender) WITH FILLFACTOR=10; --用系统存储过程查看索引信息 USE sample_db; GO exec sp_helpindex 'teacher'; --查看索引统计信息 DBCC SHOW_STATISTICS ('sample_db.dbo.teacher',Idx_phone); --【例】将teacher表中的索引名称Idx_nameAndgender更改为multi_index, --输入如下: USE sample_db; GO exec sp_rename 'teacher.Idx_nameAndgender' ,'multi_index', 'index'; --【例】删除表teacher中的索引 multi_index,如下: USE sample_db; GO exec sp_helpindex 'teacher' DROP INDEX teacher.multi_index exec sp_helpindex 'teacher';