数据库索引的通俗理解

最近使用到Oracle数据库的索引比较多,所以就想好好研究一下索引到底是什么。毕竟作为一个Application Developer,而不是DBA,所以这篇文字也是很通俗,特别浅显的描述了一下索引相关的概念。
为什么需要索引?数据在磁盘上是以块的形式存储的。为确保对磁盘操作的原子性,访问数据的时候会一并访问所有数据块。磁盘上的这些数据块与链表类似,即它们都包含一个数据段和一个指针,指针指向下一个节点(数据块)的内存地址,而且它们都不需要连续存储(即逻辑上相邻的数据块在物理上可以相隔很远)。
举个例子来讲,我们有一个数据表User.为了简便,这个表没有主键。


虽然这些数据都存在于一个User表中,但是物理上,这些数据可能存储在分散的数据块中。
查找Lily这个人的信息, 已知Lily的Identity为2, select * fromUser where Identity= 2.
在查找的时候,首先找到这个表的第一条记录所在的数据库地址,然后发现Identity为1,并不是所需要的值,然后在这个数据库的底端,找到了下一个数据块的地址。(这个类似于链表),如此一来,查询了5次才找到了所需要的值。(为了简单起见,我们考虑Identity不能有重复值)
为了加快搜索速度,这里就出现了索引。索引是对某个字段进行排序的一种方式。对表中的某个字段建立索引会创建另一种数据结构,其中保存着字段的值,每个值又指向与它相关的记录。这种索引的数据结构是经过排序的,因而可以对其执行二分查找。

对上个表的Identity字段进行索引,就是在数据库存储空间上创建一块专用的控件,把User表的所有的Identity字段的值拿出来放到这里,并且对这些值进行排序,并且每个值都携带着这个Identity对应的行所在数据块的地址。因为Identity是进过排序的,按照一定的数据结构存储的,所以数据库引擎在查找的时候,比如说查找identity为5,引擎就会计算,5大概在整个排序结构的大致地方,然后到那里去拿出这个值看看是不是,不是的话就再次相应的向左或者向右移动去寻找。(这里用到的知识都是大学时候的数据结构的知识,二分法查找,相对于毫无头绪的一个一个的查找,二分法的查找速度明显的提高,达到了log2 N,其实这有多快我也不明白,反正就记得当时学的时候,确实是比一般查找快多了。)

通俗的来讲,就是根据你指定的列,建立一个遵循一定数据结构的区域,这些区域可以快速定位到相应数据库字段所在的磁盘地址。
索引的好处是特别明显的,那就是大大的提高了查询的速度。但是相对应的也带来了一些不好的地方。

第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

最后还有一点需要注意的是,我们在数据库上对于某个字段建立了索引,那么什么情况下才走索引呢?
比如 select * from User where Identity= 2 这条语句,是走索引查询的。因为是否走索引取决于这条查询语句的where子句。数据库引擎发现你的where语句中有identity,那么就会从identity的索引数据结构中进行检索。曾经看到有人说select *会降低检索速度,这个跟索引没关系,select * 降低检索速度,是因为从数据库服务器端到客户端的网络传输是有时间的,select * 中难免包含着不必要的字段,所以传输起来会比较慢。
接下来单纯的比较一下select * 与select 单个字段在速度上的区别。如果数据量非常非常大的话,这种速度上的差别是非常明显的。下边这个例子,是从相同的数据库表中去拿数据。
当只是返回一个OUT_ID字段的时候,你可以看到49秒钟的时候就处理了30万条数据。


这时候我们使用select * 这种方式,我们发现,在用事一分钟的时候,才处理了3万条数据。


从上边的对比中我们可以看出,在数据量非常大而且数据表字段非常多的时候,这两种方式在检索时间上的差别还是非常大的。

转自:http://blog.csdn.net/sundacheng1989/article/details/53117172

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 数据库系统概念是一本介绍数据库系统基本概念、理论和实践的重要书籍。该书由Abraham Silberschatz、Henry F. Korth和S. Sudarshan合作编写,已经成为了数据库领域的经典教材。本书精讲了数据库系统中数据、数据模型和数据管理的概念,以及关系数据库、SQL语言、索引、事务处理、并发控制等等重要内容。 该书首先介绍了数据库系统的基本概念,包括数据模型、数据库语言、数据管理和数据管理系统的体系结构等方面。接着,书中介绍了关系数据库及SQL语言的基本概念和用法。书中详细讲解了关系模型的规范化理论和设计,包括函数依赖、多值依赖和范式等重要概念。 在对SQL语言的介绍中,书中详细讲解了SQL的基本语法、查询操作、聚合操作、连接操作等重要内容。同样,对索引、事务处理、并发控制等内容,书中也都有详细的讲解,有助于读者更好地理解和实践。 在书的最后,介绍了数据库系统中一些新的技术和应用,如NoSQL数据库、数据仓库等,同时还提供了对完成实际数据库应用的案例研究。 总之,数据库系统概念是一本非常重要的数据库教材,详尽地阐述了数据库系统的理论和实践。读者不仅可以学习到数据库基础知识,同时也可以在实践中应用。本书适合数据库从业人员、数据库开发人员和计算机科学专业学生阅读。 ### 回答2: 《数据库系统概念》是一本介绍数据库系统的经典教材,由加州大学伯克利分校的教授Hector Garcia-Molina、村田昭憲和Jeffrey D. Ullman联合撰写,第一版于1982年出版,目前已经到达第七版。该书主要分为四个部分,第一部分是数据库系统概述、数据库设计和数据模型;第二部分是数据存储和查询处理;第三部分是事务管理和并发控制;第四部分是数据库安全和分布式数据库。该书不仅涵盖了数据库系统的理论基础,还包括了实践中的应用技术和案例研究。该书的优点在于系统性强、通俗易懂,既适合初学者进行入门学习,又适合高级数据库研究人员进行深入研究。随着大数据时代的到来,对数据库系统的需求越来越高,而该书正是紧跟时代需求,不断更新的教材之一。 ### 回答3: 《数据库系统概念》是一本关于数据库系统的经典教材,由美国加州大学戴维斯分校的教授艾伯特·毛瑟撰写而成。该书介绍了数据库系统的概念、原理和应用,具有广泛的学术价值和实践参考意义。 该书主要内容包括:数据模型、关系模型、SQL语言、索引和文件结构、数据库设计、安全性和完整性、并发控制、恢复和备份等。它强调了数据库领域中的基本原则和基础概念,指导读者深入理解数据库系统的工作原理和实现方法。 此外,《数据库系统概念》还结合了大量的例子和实践案例,帮助读者更好地理解和掌握数据库系统的应用。该书还特别强调了数据管理和数据安全的重要性,提供了良好的参考和指导。 总之,《数据库系统概念》是一本基础理论性的数据库系统教材,能够帮助读者深入学习和理解数据库系统的工作原理,具有很高的实践价值和学术应用价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值