技术开发 频道

详解SQL Server数据库索引

  【IT168技术文档】

  一、理解索引的结构

  索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。

  SQL Server 中数据存储的基本单位是页(Page)。数据库中的数据文件(.mdf 或 .ndf)分配的磁盘空间可以从逻辑上划分成页(从 0 到 n 连续编号)。磁盘 I/O 操作在页级执行。也就是说,SQL Server 每次读取或写入数据的最少数据单位是数据页。

  下面我们先简单的了解一下索引的体系结构:

  1. 聚集索引结构

  在 SQL Server 中,索引是按 B 树结构进行组织的。

  聚集索引单个分区中的结构:

聚集索引结构

  --建立UserAddDate聚集索引

  CREATE CLUSTERED INDEX [IX_UserAddDate] ON [ASPNet_zSurvey].[ZS_User]

  (

  [UserAddDate] ASC

  )

  聚集索引(Clustered Index)特点

  聚集索引的叶节点就是实际的数据页

  聚集索引中的排序顺序仅仅表示数据页链在逻辑上是有序的。而不是按照顺序物理的存储在磁盘上

  行的物理位置和行在索引中的位置是相同的

  每个表只能有一个聚集索引

  聚集索引的平均大小大约为表大小的5%左右

  2.非聚集索引结构

  非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点:

  1. 基础表的数据行不按非聚集键的顺序排序和存储。

  2. 非聚集索引的叶层是由索引页而不是由数据页组成。

  下图示意了单个分区中的非聚集索引结构:

  包含列的索引

  通过将包含列(称为非键列)添加到索引的叶级,可以扩展非聚集索引的功能。键列存储在非聚集索引的所有级别,而非键列仅存储在叶级别。

  下面举个简单的例子来说明一下聚集索引和非聚集索引的区别:

  我们有一本汉语字典,可以把它的正文本身看做是一个聚集索引,它是按照汉字拼音的开头字母排序的,不再需要查找其他目录。当遇到不认识的字时,需要结合“部首目录”和“检字表”, 先找到目录中的结果,然后再翻到您所需要的页码。通过这种方法查到的目录中字的排序并不是真正的正文的排序方法。把这种看做是一个非聚集索引。

  另外,请注意每个表只能有一个聚集索引。

  --建立UserAddDate非聚集索引

  CREATE NONCLUSTERED INDEX [IX_UserAddDate] ON [ASPNet_zSurvey].[ZS_User]

  (

  [UserAddDate] ASC

  )

  非聚集索引 (Unclustered Index) 特点

  非聚集索引的页,不是数据,而是指向数据页的页。

  若未指定索引类型,则默认为非聚集索引

  叶节点页的次序和表的物理存储次序不同

  每个表最多可以有249个非聚集索引

  在非聚集索引创建之前创建聚集索引(否则会引发索引重建)

0
相关文章