SQL里的索引(index)知识:

索引分为聚集索引非聚集索引,数据库中的索引类似于一本书的目录,在一本书中通过目录可以快速找到你想要的信息(例如字典里按照拼音或部首查找)。索引的目的是提高系统性能,加快数据的查询速度与减少系统的响应时间 。索引建少了,用where子句找到数据效率低,不利于查找数据。索引建多了,不利于新增、修改和删除等相关操作。因为做这些操作时,除了要更新数据表本身,还要连带立即更新所有的相关索引,而且过多的索引也会浪费硬盘空间。

索引的分类:

  • 唯一索引(UNIQUE):每一行的索引值都是唯一的(创建了唯一约束,系统将自动创建唯一索引)
  • 主键索引:当创建表时指定的主键列,会自动创建主键索引,并且拥有唯一的特性。
  • 聚集索引(CLUSTERED):聚集索引就相当于使用字典的拼音查找,因为聚集索引存储记录在物理上是连续存在的,即拼音a过了就是b一样。
  • 非聚集索引(NONCLUSTERED):非聚集索引就相当于使用字典的部首查找,非聚集索引是逻辑上的连续,物理存储并不连续。

PS:聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。

什么情况下使用索引

mysql groupby 非聚合列 sql 非聚集索引_mysql

语法

//在创建表的同时创建索引
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