APP下载

关于数据库索引的探讨

2013-08-15陕西财经职业技术学院信息工程系杨军莉

电子世界 2013年6期
关键词:链表新华字典数据表

陕西财经职业技术学院信息工程系 杨军莉

由于计算机网络技术的迅猛发展,企业间数据交流的各种数据量的急剧增长,不但要求处理的结果要准确,而且也要求处理速度及时,这对数据库的处理能力能力方面提出了更高的要求,如何设置有效的数据库索引达到数据库优化是本文要讨论的重点。

应用索引的过程其实类似于查新华字典,比照数据库的概念,新华字典里的拼音检字法和部首检字法就是新华字典的两种不同的索引,而新华字典的正文则相当于表同时创建索引并不会改变表中的数据的物理位置,它只是创建了一个新的数据结构指向数据表。比起逐一查阅字典正文查找某一个具体的汉字,显然不管使用哪种检字法都可以很快地在字典正文中找到这个汉字,这就是使用索引的给我们带来的好处。如何准确高效地从海量的信息中查询到想要的数据,已成为数据库设计人员的首要任务。

所以我们可以从逻辑上简单地认为,索引是一个单独的、物理的数据结构,它主要包含两列内容,第一列是从表或视图中的列或列的组合所生成的键值的集合,且根据键值以升序或降序排列。这一列类似于新华字典的音序,它以字母升序排列,即A在最前,而Z在最后。索引的另外一列则是指向表中这些值的数据页的逻辑指针的集合。这一列则类似于对应音序的页码。索引依赖于表,作为表的组成部分,由数据库系统自动维护,是对数据库表中一个或多个列的值进行排序的数据结构,不同的索引对应不同的排序方法。一个表的存储是由两部分组成的,一部分是用来存放数据的数据页面,另一部分是用来存放索引的索引索引页面,通常索引页面比数据页面小得多。

假设表中的数据在磁盘上存储是有序的,那么当在数据库在进行插入数据、删除数据和更新数据时,则一定会导致数据的顺序会发生变化,为了保证数据的连续性和有序性,就需要重新移动数据,改变它们的物理位置,而种移动将会导致增大磁盘的I/O操作,使得整个数据库运行非常缓慢;使用索引的主要目的是使数据逻辑有序。为了实现数据逻辑有序,实际上索引的物理结构是一个双向链表,使用双向链表来保证数据的逻辑顺序,如果要对表中的一个已有结点进行更新则仅需修改该节点的前驱和后继,而且无需修改该节点的物理位置;如果要在两个节点中插入一个新的节点只需修改节点的前驱和后继,而且无需修改新节点的物理位置;如果要删除一个已有结点,则仅需修改其前驱结点的后继为该被删除结点的后继。总的来说,索引保存着具体数据的物理地址值。

索引从大的方面分为聚集索引和非聚集索引。所谓聚集索引是指表中数据的物理顺序是和索引的顺序是一至的,数据页是聚集索引的叶节点,数据页之间通过双向链表的形式连接起来,而且实际的数据都存储在数据页中。查询时,数据库首先根据索引查找,找到索引值后,接着查找该索引的数据页(叶节点)获取具体数据。如果没有索引,则查询时会进行全表的遍历。第二类索引则称为非聚集索引,非聚集索引是物理存储不按照索引排序,非聚集索引的叶节点(IndexLeafPages)包含着指向具体数据行的指针或聚集索引,数据页之间没有连接是相对独立的页。具体地来说,非聚集索引又分为:①堆表非聚集索引在没有聚集索引的情况下,表中的数据页是通过堆(Heap)形式进行存储,堆是不含聚集索引的表;SQLServer中的堆存储是把新的数据行存储到最后一个页中。非聚集索引通过双向链表连接,而叶节点包含指具体数据行的指针。堆表中查询信息时,首先遍历索引,获取到指针信息,再根据指针信息获取相应数据页中的数据。②聚集表非聚集索引当表上存在聚集索引时,任何非聚集索引的叶节点就不是指针值,而是包含聚集索引的索引值。非聚集索引依然通过双向链表连接,但叶节点包含的是索引表的索引值。在聚集表中查询信息时,首先遍历索引,获取索引值,然后根据索引值获取相应数据页中的数据。

数据库查询表主要通过以下五种方式:

①TableScan:扫描整个表,这个操作将会逐行检查整个表,直到找到所匹配的记录行或者扫描完整个表。可以看出,这种查找记录的方式效率是最差的。

②IndexScan:根据索引,按照一定的算法从表中过滤出来一部分记录,在过滤出来的这一部分记录中进行查找所匹配的记录行,显然这种方式比第一种方式的查找范围要小,因此比TableScan的查找效率高。

③IndexSeek:根据索引,直接定位(获取)记录的存放位置,然后根据获取的记录的存放位置,直接取得记录,因此,比TableScan、IndexScan快。

④ClusteredIndexScan:与TableScan相似,这种方式也是要遍历整个表,但是它与TableScan不同的是数据表中的记录已经按照聚集索引来排列了,即记录实际就是按聚集索引的来顺序存放的。而TableScan扫描的表只是没有建立聚集索引,表中的记录没有按照一定的顺序存放,因此这两个操作本质上是一样的。

⑤ClusteredIndexSeek:这种方式是直接根据聚集索引获取记录,因为表中的记录已经按照聚集索引排列了,所以是最快的查询方法。

一个表是不是索引越多越好呢,当然不是。因为增加索引后,会增加维护该索引的时空开销,修改数据表时,必须要更新相应字段的索引。当一个表中的索引过多时,也严重会影响性能。一般会考虑在经常查询的列上建立相关索引并及时删除不需要的索引。

总之,索引使数据库引的查询操作执行的速度更快,它可以有针对性的数据检索,而不是简单地整个表扫描(FullTableScan)。在数据库中,为表添加必要的索引会提高查询的执行效率,但是过多的索引必然需要更新和维护索引表,这将会导致系统性能下降,所以必须控制索引的数量及时删除不必要的索引。

[1]曹素丽,杨延广.ORACLE数据库索引的设计与维护研究[J].微型电脑应用,2012(11):29-31.

[2]马守东.关系数据库索引的研究和探索[J].信息与电脑(理论版),2011(10):159-160.

[3]张效尉,姜静.内存数据库技术研究[J].软件导刊,2011(10):147-148

[4]涂刚,刘华清,傅伟.数据表结构的研究[J].天水师范学院学报,2009(5):86-88.

[5]岳国华.提高ORACLE8i数据库响应速度的若干技术对策[J].计算机应用与软件,2004(5):110-112.

猜你喜欢

链表新华字典数据表
新华字典
湖北省新冠肺炎疫情数据表(2.26-3.25)
湖北省新冠肺炎疫情数据表
基于二进制链表的粗糙集属性约简
跟麦咭学编程
基于列控工程数据表建立线路拓扑关系的研究
基于链表多分支路径树的云存储数据完整性验证机制
新版《新华字典》将收入网络用语
《新华字典》修订将加注常用网络流行用语
《新华字典》背后那些事儿