一直不理解索引到底是什么东西,把它跟primary key和unique的概念弄得十分模糊。上午查阅了一些资料,刚刚有些开朗的感觉。
primary key和unique都是针对某一列的一种约束。一种限制,看不见摸不着。
primary key表示该列中的数据唯一,且非空。
unique表示该列中的数据唯一,可为空。
而索引并不是一种约束,而是实际存在在物理空间中的。
索引就同论文中的目录(也叫索引)是一样的。创建了目录,能够方便我们快速的找到我们想看的内容(查询速度快的体现),但是,当论文的内容结构有变化的时候,比如说插入了新的一个章节,那么目录的内容也会跟着变化,如果修改比较频繁的话,那么我们可以想象得到,每修改一次内容都要修改一次索引,会比较麻烦。(频繁插入,更新或删除时遇到的问题的体现)
我们在对表中的某一列进行primary key约束或unique约束的时候,oracle服务器会自动的为这个表创建一个索引(唯一索引,具体参考:http://msdn2.microsoft.com/zh-cn/library/ms187019.aspx)。
设置主键之后,当查询时,实际上起作用的是主键索引而并非是主键。索引也分为很多种类型,我平时用不上,没做细研究。只知道索引可以分为聚集索引和非聚集索引。
在MSDN上的资料:
聚集索引
聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。
只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。
非聚集索引
非聚集索引具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。
从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位器是聚集索引键。
在 SQL Server 2005 中,可以向非聚集索引的叶级别添加非键列以跳过现有的索引键限制(900 字节和 16 键列),并执行完整范围内的索引查询。
聚集索引和非聚集索引都可以是唯一的。这意味着任何两行都不能有相同的索引键值。另外,索引也可以不是唯一的,即多行可以共享同一键值。
每当修改了表数据后,都会自动维护表或视图的索引。
由此可见,设计一个良好的索引能够大大提高表的查询速度,但同时也承担着一些风险。
索引的工作:
表是平面的,没有层级关系,在进行查询的时候,就是一行一行的扫。而索引实际上是使用了一个复杂的自平衡B+tree结构,有层级关系,所以使用索引查找数据能够快速准确的定位到相关数据,并根据索引上的指针找到对应的数据记录。因此通过索引查询数据比全表扫描快得多。同样在联结多个表时使用索引也可以提高效率。
进一步理解:
索引和表之间是相对独立而又关系密切的,简单的说就是索引是将表的部分字段拿出来重新组织排序并为表查询服务。
所以当一个表在执行insert,update,delete操作的时候,索引也将会发生变化(怎么变化的跟B+树的结构有关,我不大懂,反正会变化,简单的讲绝大部分情况增加一个记录只会影响一个索引块)。所以当对一个表的insert,update,delete操作比较频繁的时候,我们就要考虑索引的使用与维护的问题。如何使其最优,有待研究。
最后理解:
过多的索引会降低数据操作的速度,但会提高查询的速度,这需要自己在数据操作和查询中进行权衡。
如果进行大量insert和delete之后,会影响一些效率,这时候通常要将索引rebuild一下。
ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>
分享到:
相关推荐
根据给定的文件信息,以下是对“Python初步”这一主题涉及的关键知识点的详细解析: ### 一、Python简介 Python是一种高级编程语言,以其简洁易读的语法而闻名,非常适合初学者入门。它支持多种编程范式,如面向...
在SQL的学习中,首先会接触到的是一些基础概念,如数据库(Database)、表(Table)、字段(Field)和记录(Record)。理解这些概念是学习SQL的基础。数据库是存储数据的容器,而表则是数据库中的数据结构,由一系列...
《张量初步》是一本深入探讨...总的来说,《张量初步》PDF版是一份宝贵的教育资源,无论你是初次接触张量还是希望深入理解其内在机制,都能从中受益。通过详尽的解释和实例,这份教材将引导你踏入张量世界的精彩旅程。
12. **数据库设计与范式理论**:初步接触数据库设计的基本原则,如第一范式(1NF)、第二范式(2NF)和第三范式(3NF),以及如何避免数据冗余和不一致。 13. **连接与操作MySQL**:通过命令行客户端`mysql`或者图形化...
10. **大数据与分布式数据库**:初步接触NoSQL数据库,了解其与关系型数据库的区别,以及在大数据环境下的适用性。 通过这个实验答案集,学生可以巩固理论知识,提升动手能力,为未来在实际工作中解决数据库相关...
在初步接触Nutch时,用户可以通过以下几种方式实践: - **爬行企业内部网**:通过配置Nutch,可以抓取公司内网的网页,了解Nutch的基本操作流程。 - **爬行全网**:了解Nutch的数据集构成,尝试抓取特定类型的网址...
11. PL/SQL基础:初步接触Oracle的PL/SQL编程语言,包括声明变量、控制结构(IF-THEN-ELSE、CASE、LOOP)、异常处理和过程、函数的创建与调用。 12. 数据约束:学习如何在表定义中添加约束,如非空约束(NOT NULL)...
这个chm格式文档是本人在开发过程中整理的,依据是OpenSSL官方网站,增加目录、索引以及搜索功能,希望能给初步研究的朋友一点脉络,也给开发的朋友快速查找函数提供点方便。 This OpenSSL-SDK Documentation is ...
8. **性能监控与优化**:初步接触性能监控工具,如V$视图和动态性能视图,学习如何分析和解决性能问题。理解SQL优化器的工作原理,以及如何通过调整SQL语句或索引来提升查询速度。 9. **并发控制**:理解Oracle的...
在第7章中,我们首先会接触到搜索引擎的基本架构。这一部分会详细阐述搜索引擎如何进行信息的采集、索引构建和查询处理。信息采集主要涉及到网络爬虫的技术,包括URL管理、网页下载和内容提取等步骤。索引构建则涵盖...
实验一通常涉及数据库系统的初步认识和基本操作,包括创建数据库、数据表,以及了解SQL语言的基本语法。通过实验报告,学生可以学习如何使用SQL语句INSERT、UPDATE和DELETE进行数据的增删改操作,并掌握SELECT语句...
2. **函数和过程**:理解内置函数的使用,如字符串处理函数、数学函数等,并初步接触过程(PROCEDURE)的概念。 3. **程序结构与调试**:学习如何组织代码,使用注释,以及如何调试和解决程序中的错误。 第三章往往...
12. **报表服务和数据分析**:初步接触SQL Server 2000的报表服务,学习如何创建简单的报表,并了解数据分析的基础,如使用OLAP(在线分析处理)和数据挖掘。 《SQL Server 2000 开发人员指南》将这些内容系统地...
通过深入学习和实践Oracle的第7-8章内容,初学者可以建立起对Oracle数据库系统的初步认识,为进一步的数据库管理和开发工作奠定坚实基础。在实际操作中,结合理论知识和动手实践,你将逐渐熟悉Oracle的特性和操作,...
在Oracle Fundamentals I的学习中,你会接触到以下核心概念: 1. **数据库体系结构**:了解Oracle数据库的组成部分,如数据库实例、数据文件、控制文件、重做日志文件、参数文件等,以及它们如何协同工作以确保数据...
6. **数据库备份与恢复**:初步接触Oracle的备份策略,包括物理备份和逻辑备份,以及简单的数据恢复操作。 7. **数据库性能优化**:学习如何使用Explain Plan分析SQL执行计划,理解索引优化的重要性,以及如何通过...
此外,还将初步接触SQL查询、表单设计和程序设计的基本原理。这是进一步深入学习VFP,乃至其他数据库系统的关键基础。通过不断的实践和练习,你将能够在实际项目中熟练运用这些知识,为今后的数据库管理和应用开发...