索引
1.是什么?为什么?
索引的主要目的是提高系统的性能,加快数据的查询速度与减少系统的响应时间
2.分类
索引有两种类型,聚集索引(clustered index)和非聚集索引(unclustered index)
2.1 聚集索引
2.1.1 定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同。一个表中只能拥有一个聚集索引
2.1.2 适用情况:
经常对某些列进行范围搜索,例如查询一段日期范围。当找到包含的第一个数据的行之后,便可以确保后续索引值的行在物理位置上相邻。
经常对查出的数据按照某一列进行排序,也可以在该列上建立聚集索引,避免在每次查询数据时都进行排序,从而节约时间成本。
当索引值唯一时,使用聚集索引查找特定的也很有效率,例如建立主键
|
动作描述 |
使用聚集索引 |
使用非聚集索引 |
|
外键列 |
应 |
应 |
|
主键列 |
应 |
应 |
|
列经常被分组排序(order by) |
应 |
应 |
|
返回某范围内的数据 |
应 |
不应 |
|
小数目的不同值 |
应 |
不应 |
|
大数目的不同值 |
不应 |
应 |
|
频繁更新的列 |
不应 |
应 |
|
频繁修改索引列 |
不应 |
应 |
|
一个或极少不同值 |
不应 |
不应 |
3.建立索引的原则
1) 定义主键的数据列一定要建立索引。
2) 定义有外键的数据列一定要建立索引。
3) 对于经常查询的数据列最好建立索引。
4) 对于需要在指定范围内的快速或频繁查询的数据列;
5) 经常用在WHERE子句中的数据列。
6) 经常出现在关键字order by、group by、distinct后面的字段,建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致,否则索引不会被使用。
7) 对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。
8) 对于定义为text、image和bit的数据类型的列不要建立索引。
9) 对于经常存取的列避免建立索引
9) 限制表上的索引数目。对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。索引虽说提高了访问速度,但太多索引会影响数据的更新操作。
10) 对复合索引,按照字段在查询条件中出现的频度建立索引。在复合索引中,记录首先按照第一个字段排序。对于在第一个字段上取值相同的记录,系统再按照第二个字段的取值排序,以此类推。因此只有复合索引的第一个字段出现在查询条件中,该索引才可能被使用,因此将应用频度高的字段,放置在复合索引的前面,会使系统最大可能地使用此索引,发挥索引的作用。
4.创建、删除索引
创建聚集索引:
create clustered index INX_INDEX on TeacheInfo(Tno,Tname,Tsex,Tage)
创建非聚集索引:
create nonclustered index INX_INDEX on TeacheInfo(Tno,Tname,Tsex,Tage)
删除索引:
if exists(select * from sysindexes where name=索引名)
drop index 索引名
go
4.总结
使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。
非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。
不是所有的表都适合建立索引,只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好。
5.索引不起作用的情况

浙公网安备 33010602011771号