SQLSever——索引简介
该表的索引与字典中的索引非常相似。可以大大提高查询速度。对于大型表,通过添加索引,通常需要几个小时才能完成的查询可以在几分钟内完成。(对于包含索引的数据库,SQL Sever需要相当大的额外空空间。例如,构建一个聚集索引,大约需要1.2倍空的数据大小。速度是有代价的。)
聚集索引和非聚集索引
假设你已经通过字典的索引找到了一个单词的页码。一旦你知道了页码,你可以在字典中随意查找,直到找到正确的页码。这里有一个更有效的方法来查找页码。
首先,把字典翻到一半左右的地方。如果你要找的页码比字典一半的页码小,就翻到四分之一。否则,把书翻到四分之三。这样,您可以继续将词典分成更小的部分,直到找到正确的页码。这是一种非常有效的查找页面的方法。(呵呵,这个例子比比皆是,和Hello world一样。)SQL Sever的表索引工作方式类似。表索引由一组页面组成,这些页面形成了一个树形结构。根在逻辑上将一个表的记录分成两部分,并且通过指向另外两个页面。根页面指向的两个页面将记录分成更小的部分。每页将记录分成更小的分区,直到它到达叶页。
有两种类型的索引:聚集索引和非聚集索引。
在聚集索引中,索引树的叶页包含实际数据:记录的索引顺序与物理顺序相同。
在非聚集索引中,叶页指向表中的记录:记录的物理顺序不一定与逻辑顺序相关。
簇索引与目录非常相似,目录的顺序与实际页码顺序一致。非聚集索引更像是书籍的标准索引表,索引表中的顺序通常与实际页码顺序不一致。一本书可能有多个索引。例如,它可能同时具有主题索引和作者索引。同样,一个表可以有多个非聚集索引。
通常,您使用聚集索引,但是您应该知道这两种索引的优缺点。
每个表只能有一个聚集索引,因为表中的记录只能以一种物理顺序存储。通常,您需要根据标识字段在表上建立聚集索引。但是,您也可以为其他类型的字段创建聚集索引,如字符、数字和日期时间字段。
从具有聚集索引的表中提取数据比从具有非聚集索引的表中提取数据要快。当需要获取一定范围的数据时,使用聚集索引比使用非聚集索引更好。例如,假设您使用一个表格来记录访问者在您的网络上的活动。如果希望检索某段时间内的登录信息,应该在该表的DATETIME字段上设置聚集索引。
聚集索引的主要限制是每个表只能建立一个聚集索引。但是,一个表可以有多个非聚集索引。事实上,每个表最多可以建立249个非聚集索引。还可以在表上创建聚集索引和非聚集索引。
如果您不仅想按日期,还想按用户名从网络活动日志中获取数据。在这种情况下,同时建立聚集索引和非聚集索引是有效的。您可以为日期和时间字段设置聚集索引,为用户名字段设置非聚集索引。如果发现需要更多的索引方法,可以添加更多的非聚集索引。
非聚集索引需要大量硬盘空和内存。此外,尽管非聚集索引可以提高从表中获取数据的速度,但它也会降低向表中插入和更新数据的速度。每当更改具有非聚集索引的表中的数据时,必须同时更新索引。因此,在对表建立非聚集索引时,应该仔细考虑。如果您预计一个表需要频繁地更新数据,就不要在其上建立太多的非聚集索引。此外,如果硬盘和内存空之间的空间有限,那么也应该限制非聚集索引的数量。
索引属性
这两种类型的索引都有两个重要的属性:
你可以使用其中任何一种类型同时索引多个字段(复合索引);
这两种类型的索引都可以指定为索引。
您可以为多个字段构建复合索引,甚至是复合聚集索引。假设有一个记录访问者姓氏和名字的表。如果您想根据完整的姓名从表中获取数据,您需要构建姓氏字段和名字字段的索引。这不同于为两个字段建立单独的索引。当您希望同时查询多个字段时,应该建立多个字段的索引。如果要分别查询每个字段,应该为每个字段建立一个独立的索引。
这两种类型的索引都可以被指定为索引。如果某个字段被编入索引,您将无法在该字段中输入重复值。标识字段将自动成为值字段,但您也可以索引其他类型的字段。假设您使用一个表来保存您的网点的用户密码,您肯定不希望两个用户有相同的密码。通过强制字段成为值字段,可以防止这种情况发生。
0条评论