首先我们要知道数据库索引是用来干什么的:
索引是为了加快数据查找速度而引入的,数据库中存储的数据在物理层是随机存储的,对某个列建立索引就会对该列的关键值进行排序并用某种数据结构存储他的值和对应的物理地址,在SQL中用的数据结构是B树。
索引的分类

1. 聚集索引
聚集索引会对数据按索引按索引关键字进行物理排序。对于经常要搜索列在连续范围内的值的查询特别有效。
下列情况可考虑创建聚集引:
(1) 包含大量非重复值的列。
(2)使用下列运算符返回一个范围值的查询: BETWEEN AND、>、>=、<和<=。(3)经常被用作连接的列,-般来说,这些列是外键列。
(4) 对ORDER BY或GROUP BY子句中指定的列建立索引,可以使数据库管理系统在查询时不必对数据再进行排序,从而提高查询性能。

2. 非聚集索引
非聚集索引不对数据按索引关键字值进行物理排序,只是对索引关键字排序。
下列情况可考虑创建聚集引:
(1) 包含大量非重复值的列。如果某列只有很少的非重复值,比如只有1和0,则不对这些列建立非聚集索引。
(2)经常作为查询条件使用的列。(3) 经常作为连接和分组条件的列。
3. 唯一索引:
UNIQUE 例如:create unique index stusno on student(sno);
唯一索引值用于确保列不包含重复的值,唯一索引可以只包含一个列(限制该列取值不重复),也可以有多个列共同组成(限制这些列的组合取值不重复)
当在列上创建UNIQUE和PRIMARY KEY约束时,系统会自动在这些约束列上创建唯一索引。聚集索引和非聚集索引都可以是唯一索引。

创建和删除索引

1. 创建索引

确定了索引关键字之后,就可以在数据库的表上创建索引。创建索引使用的是CREATEINDEX语句,
语法格式为:
CREATE [UNQUE] CLUSTERED 1 NONCLUSTERED]INDEX <索引名> ON <表名>( <列名>.)

其中:

UNIQUE表示要创建的索引是唯-索引。CILUSTERED表示要创建的索引是聚集索引。
NONCLUSTERED表示要创建的索引是非聚集索引。如果没有指定索引类型,则默认是创建非聚集索引。
//为Sudent表的Sname列创建非聚集索引。CREATE INDEX Sname ind
ON Student ( Sname )
//为Student表的Sid列创建唯聚集索引。
CREATE UNIQUE CLUSTERED INDEX Sid ind
ON Student ( Sid )
//为Employee表的FirstName 和LastName列创建个聚集索引。
CREATE CLUSTERED INDEX EName jind
ON Employee ( FirstName, LastName )
  1. 删除索引

索引经建立,就由数据库管理系统自动使用和维护,不需要用户干预。建立索引是为了加快数据的查询效率,但如果要频繁地对数据进行增、删、改操作,则数据库管理系统会花费很多时间来维护索引,这会降低数据的修改效率;另外,存储索引需要占用额外的空间,这增加了数据库的空间开销。因此,当不需要某个索引时,可将其删除。
在SQL语言中,删除索引使用的是DROP INDEX 语句。
语法格式为:
DROP INDEX <表名>. <索引名>

//删除Student表中的Sname ind 索引。
DROP INDEX Student. Sname

建立索引的优缺点:

优点:
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:

1.索引需要占用数据表以外的物理存储空间
  2.创建索引和维护索引要花费一定的时间
  3.当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。