集群索引(Clustered Index)指的是表中所有数据按照这种索引进行排序。当您创建PrimaryKey(主键)时,就创建了该集群索引。每个表只能有一个集群索引。
因此,根据您将针对表运行的查询,可以在其他两列上创建非聚集索引(Nonclustered Index)。
还要注意,集群索引应尽可能窄。原因是它包含在所有其他索引中。因此,当您在Title列上创建索引时,即使您没有指定它,它也将包含CategoryId列。
在创建索引时,您还应考虑另一个方面。列可以是索引的一部分,也可以仅是“包括在内”的。这意味着它包含在索引中,但数据不使用此列进行排序。当您想要在索引中使用列时,这可能会很方便,而且您不会在where子句或join中使用它,但它将是您查询的输出。特别是当此列中的数据经常更改时。
让我们以您的表为例,并向其中添加一些数据。
insert into Category (Title, Description) values ('Title2', 'Description2_B')
insert into Category (Title, Description) values ('Title2', 'Description2_A')
insert into Category (Title, Description) values ('Title1', 'Description1_B')
insert into Category (Title, Description) values ('Title1', 'Description1_A')
现在在“标题”和“描述”列上创建索引。
create nonclustered index idx_category_title on Category (title, Description)
在这个表上运行 select 命令将会给你:
select Title, Description from category where title Like 'Title%'
Results:
| Title | Description |
|
| Title1 | Description1_A |
| Title1 | Description1_B |
| Title2 | Description2_A |
| Title2 | Description2_B |
正如您所看到的,结果首先按标题排序,然后按描述排序。使用此索引,每次修改描述时,您的索引都必须更新以使数据排序。
现在让我们尝试相同的表格和相同的数据,但使用“包含”列作为索引。
create nonclustered index idx_category_title on Category (title) include (Description)
在这个设置下运行相同的选择操作将会给出以下结果:
select Title, Description from category where title Like 'Title%'
Results:
| Title | Description |
|
| Title1 | Description1_B |
| Title1 | Description1_A |
| Title2 | Description2_B |
| Title2 | Description2_A |
正如您所看到的,数据按标题排序,但不按描述排序。真正的性能提升在于修改描述。由于索引未使用此列进行排序,因此更改它不会更改索引中记录的位置。