设为首页 加入收藏

TOP

SQL应用与开发:(九)提高效率的索引(一)
2015-07-24 10:39:39 来源: 作者: 【 】 浏览:4
Tags:SQL 应用 开发 高效率 索引

数据库中,索引是一个特殊的对象,是一种可以加快数据检索的数据库结构,它可以从大量的数据中迅速找到需要的内容,使得数据查询时不必检索整个数据库。索引是一种基于表中数据的对象,与视图不同,索引需要占用物理存储。使用数据库的索引,使我们能够较快的查询数据。

1.简介

索引是表示数据的一种方式,它提供的数据顺序不用于数据在磁盘上的物理存储顺序。索引基于表的一列或多列组合建立,在表内重新排列记录的物理位置。当使用索引时,数据是以分类排序的方式提供给用户的,排列顺序可以用创建索引语句控制。通常,通过在正确的列上建立索引,可以使数据库性能显著提高,特别是在表之间的联接列上建立索引更是如此。

索引和图书目录的作用类似。如果把数据表中的数据看作是书的内容,则索引就是书的目录。书的目录指向了书的内容(通过页码)。同样,索引是表的关键值,它提供了指向表中行的指针。目录中的页码是达到书内容的直接路径,而索引也是到达表数据的直接路径,从而更高效地访问数据。

在数据库关系图中,可以为选择的表创建、编辑或删除索引/键属性页中的每个索引类型。当保存附加在此索引上的表或包含此表的数据库关系图中,索引同时也被保存。

?

1.1优点

索引是一个独立的、物理的数据库结构,数据库用户可以利用索引快速访问数据库表中的特定信息。

通常情况下,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引将占用磁盘空间,并且降低添加、删除和更新行的速度。不过在大多数情况下,索引所带来的数据检索数据的优势大大超过它的不足之处。然而,如果应用程序频繁的更新数据,或者磁盘空间有限,那么最好不限制索引的数据。

总体来说,索引是为了加速检索速度而创建的一种存储结构。索引针对一个表建立,它由存放有数据页面以外的索引页面组成。每个索引页面中的行都包含逻辑指针,通过该指针可以直接检索到数据,这机会加速物理数据的检索。

对表中的列是否创建索引以及创建何种索引,对数据的检索速度有很大影响。创建了索引的列几乎可以立即响应查询,而未创建索引的列查询时就需要等待很长时间。因为对于未创建索引的列,需要逐行进行搜索,这种索引耗费的时间直接同表中的数据量成正比。

利用索引进行查询具有以下优点:

提高查询速度:如果一个表中没有索引,在进行查询时,数据库就会强制按照表的顺序逐行进行搜索,若要找到满足条件的行,则需要访问表的每一行,显而易见要花费很长的时间。但是如果要查询的表中的位置信息确定表中的行,这样便缩短了查询的时间;

提高连接、ORDER BY和GROUP BY的执行速度:连接、ORDER BY和GROUP BY都需要对数据进行检索,如果在表中建立索引,则连接、ORDER BY和GROUP BY执行的速度将大大提高;

查询优化分析器依靠索引起作用:在执行查询的过程中,数据库会自动地对查询进行优化。由于数据库的优化依靠索引进行,所以在建立索引后,数据库会依据所建立的索引,为使索引的速度最快而采取哪些索引;

强制实施行的唯一性:创建唯一索引可以保证表中的数据不重复。

总之,索引可以改善数据查询性能,但是这是需要付出代价。带索引的数据表在数据库中会占据更多的存储空间。另外,为了维护索引,对数据进行插入、更新、删除操作的命令所花费的时间会更长。在设计和创建索引时,应确保对性能的提高程度大一在存储空间和处理资源方面的代价。

1.2注意事项

用户可根据环境的需要,在基表上建立一个或者多个索引,以提供多种存取方法,加快数据检索速度。通常,建立与删除索引由数据库管理员或表的拥有者负责完成。系统在存取数据时会自动选择合适的索引作为存取路径,用户不必也不能选择索引。

索引是一把双刃剑。虽然它会加速SELECT语句,但是它也可能减缓数据所做的更改,这是因为必须在运行时刻动态更新SQL中的索引。无论什么时候表中的数据发生改变,表中的所有索引都必须发生改变,如果这样会导致重组索引,则当索引重组发生时,可能会发生延迟。

创建索引应考虑的主要因素有:

i.一个表如果建立大量索引会影响INSERT、UPDATE和DELECT语句的性能,因为在表中的数据更改时,所有索引都需要进行适当的调整。另一方面,对于不需要修改数据的查询(SELECT语句),大量索引有助于提高性能。因为查询分析器有更多的索引可供选择,以便确定以最快的速度访问数据的最佳方法;

ii.通常我们是通过主键来对表进行查询的,因此首先应该考虑在主键列上建立索引。另外,连接中频繁使用的列(包括 外键)应作为建立索引的考虑选项;

iii.对小型表进行索引可能不会产生优化效果,因为查询分析器在遍历索引以搜索数据时,花费的时间可能比简单的表扫描更长的时间。

综上所述,由于建立索引使用需要一定的开销,而且当使用INSERT或者UPDATE对数据进行插入和更新操作时,维护索引也需要花费时间和存储空间。因此,没有必要对表中所有列建立索引。

2.类型

依据索引的顺序和数据库的物理存储顺序是否相同,可以将索引分为两类:聚集索引(Clustered Index)和非聚集索引(Non-clustered Index)。聚集索引和非聚集索引都使用B-Tree结构创建,而且都包括索引页和数据页,其中索引页用来存放索引和指向下一层的的指针,数据页用来存放记录。

根据索引键的组成,可以把索引分为唯一索引和组合索引。唯一索引(UNIQUE Index)可以确保索引列不包含重复的值,组合索引是使用表中多个列对数据进行索引的索引。另外,因SQL环境的不同还有其他的索引类型。例如,Oracle中位图索引和函数索引等。

索引一旦创建,将由数据库自动管理和维护。例如,在向表中插入、更新或者删除一条记录时,数据库会自动在索引中作出相应的修改。在编写SQL查询语句时,具有索引的表不具有索引的表没有任何区别。索引只是提供一种快速访问指定记录的方法。数据表具有索引,只会影响到表的查询速度,而不会影响到其他任何方面。

?

2.1B-Tree索引

B-Tree索引的顶端节点称为根节点(Root Node),底层节点称为叶节点(Leaf Node),在根节点和叶节点之间的节点称为中间节点(Intermediate Node)。每级索引中的页链接在双向链接列表中。B-Tree数据结构从根节点开始,以左右平衡的方式排列数据,中间可以根据需要分成许多层,B-Tree索引可以很方便地为更新提供可用空间。

下图为B-Tree的总体结构图:

?

\

由于各叶节点按照所含的索引码值有一个线性顺序,所以就可以利用各个节点的指针Pn将叶节点按照索引码值顺序链接在一起。这种顺序能够高效地对文件进行顺序处理,而B-Tree索引的其他结构能够高效地对文件进行随机处理。

2.2聚集索引

聚集索引将数据行的键值在表内排序并存储对应的数据记录,使得表的物理顺序与索引顺序一致。一个表只能包含一个聚集索引。如果不是聚集索引,表中各行的物理顺序和键值的逻辑顺序就不会匹配。

聚集索引的B-Tree是由下而上构建的,一个数据页(索引页的叶节点)包含一笔记录,再由多个数据页生成一个中间节点的索引页。然后由多个中间节点的索引页合成更上层的索引页,组合后生成最顶层的根节点的索引页。

下图为聚集索引的数据结构:

?

\

在创建聚集索引时,会对表进行复制,并且对表中的数

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇sql语句二 下一篇SQL查询初学者指南读书笔记(一)关..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·请问c语言刚入门,该 (2025-12-26 10:21:04)
·python 编程怎么定义 (2025-12-26 10:21:01)
·09-指 针 (一)-c语言 (2025-12-26 10:20:58)
·About - Redis (2025-12-26 08:20:56)
·Redis: A Comprehens (2025-12-26 08:20:53)