索引初步接触

一直不理解索引到底是什么东西,把它跟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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值