SQL里的索引(index)知识:
索引分为聚集索引和非聚集索引,数据库中的索引类似于一本书的目录,在一本书中通过目录可以快速找到你想要的信息(例如字典里按照拼音或部首查找)。索引的目的是提高系统性能,加快数据的查询速度与减少系统的响应时间 。索引建少了,用where子句找到数据效率低,不利于查找数据。索引建多了,不利于新增、修改和删除等相关操作。因为做这些操作时,除了要更新数据表本身,还要连带立即更新所有的相关索引,而且过多的索引也会浪费硬盘空间。
索引的分类:
- 唯一索引(UNIQUE):每一行的索引值都是唯一的(创建了唯一约束,系统将自动创建唯一索引)
- 主键索引:当创建表时指定的主键列,会自动创建主键索引,并且拥有唯一的特性。
- 聚集索引(CLUSTERED):聚集索引就相当于使用字典的拼音查找,因为聚集索引存储记录在物理上是连续存在的,即拼音a过了就是b一样。
- 非聚集索引(NONCLUSTERED):非聚集索引就相当于使用字典的部首查找,非聚集索引是逻辑上的连续,物理存储并不连续。
PS:聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。
什么情况下使用索引
语法
//在创建表的同时创建索引
CREATE TABLE 表名(字段名 数据类型 [完整性约束条件],
[UNIQUE | FULLTEXT | SPATIAL] [ CLUSTERED | NONCLUSTERED ] INDEX | KEY
[索引名] (字段名1 [(长度)] [ASC | DESC])
);
//在定义好表后创建索引
CREATE [ UNIQUE | FULLTEXT | SPATIAL] [ CLUSTERED | NONCLUSTERED ] INDEX|KEY index_name
ON table_name( column_name [ ASC | DESC ])
参数:
UNIQUE:可选,为表或视图创建唯一索引。 唯一索引不允许两行具有相同的索引键值。 视图的聚集索引必须唯一。如果要建唯一索引的列有重复值,必须先删除重复值。
CLUSTERED:可选,表示指定创建的索引为聚集索引。创建索引时,键值的逻辑顺序决定表中对应行的物理顺序。 聚集索引的底层(或称叶级别)包含该表的实际数据行。
NONCLUSTERED:可选,表示指定创建的索引为非聚集索引。创建一个指定表的逻辑排序的索引。 对于非聚集索引,数据行的物理排序独立于索引排序。
index_name:表示指定所创建的索引的名称。
table——name:表示指定创建索引的表的名称。
view:表示指定创建索引的视图的名称。
column_name:索引所基于的一列或多列。 指定两个或多个列名,可为指定列的组合值创建组合索引。
[ ASC | DESC]:表示指定特定索引列的升序或降序排序方向。 默认值为 ASC。
创建唯一聚集索引:
create unique clustered --表示创建唯一聚集索引
index UQ_Clu_StuNo --索引名称
on Student(S_StuNo) --数据表名称(建立索引的列名)
创建非聚集索引:
create nonclustered index NonClu_Index
on Student(S_StuNo)
with (drop_existing=on)
创建唯一索引:
create unique index NonClu_Index
on Student(S_StuNo)
with (drop_existing=on)
PS:当create index时,如果未指定clustered和nonclustered,那么默认为nonclustered
创建组合索引:
--eg1:
CREATE TABLE index5(id INT,
name VARCHAR(20),
sex CHAR(4),
INDEX index5_ns(name,sex)
);
--eg2:创建非聚集复合索引,未指定默认为非聚集索引
create index Index_StuNo_SName
on Student(S_StuNo,S_Name)
修改索引
--修改索引语法
ALTER INDEX { 索引名| ALL }
ON <表名|视图名>
{ REBUILD | DISABLE | REORGANIZE }[ ; ]
REBUILD:表示指定重新生成索引。
DISABLE:表示指定将索引标记为已禁用。
REORGANIZE:表示指定将重新组织的索引叶级。
--禁用名为 NonClu_Index 的索引
alter index NonClu_Index on Student disable
删除和查看索引
--查看指定表 Student 中的索引
exec sp_helpindex Student
--删除指定表 Student 中名为 Index_StuNo_SName 的索引
drop index Student.Index_StuNo_SName
--检查表 Student 中索引 UQ_S_StuNo 的碎片信息
dbcc showcontig(Student,UQ_S_StuNo)
--整理 Test 数据库中表 Student 的索引 UQ_S_StuNo 的碎片
dbcc indexdefrag(Test,Student,UQ_S_StuNo)
--更新表 Student 中的全部索引的统计信息
update statistics Student
无法对表创建多个聚集索引。请在创建新聚集索引前删除现有的聚集索引问题:
主键是表中一个字段或多个字段,用来唯一地标识表中的一条记录。唯一性是主键最主要的特性。建立主键的时候可以声明为CLUSTERED(聚集)或NONCLUSTERED(非聚集)。也就是说主键可以声明为非聚集索引。
CREATE TABLE student
(
stud_id INT IDENTITY(1,1) NOT NULL,
stud_name NVARCHAR(20) NOT NULL,
CONSTRAINT pk_student PRIMARY KEY NONCLUSTERED (stud_id)
);
在SQLServer中,主键的创建必须依赖于索引,默认创建的是聚集索引。跟着主键而创建的索引不可以被单独删除。
--执行删除索引语句,SQLServer将会报错。
DROP INDEX pk_student ON student