谈“索引”

原创 2006年05月28日 19:30:00

谈“索引”
(一)创建索引
对于数据库中较小的表来说,使用扫描原始数据的方法可以工作很好,然而,当数据量变大时,就必须使用索引来提高数据检索的速度。
在考虑索引的创建时,需要注意的是:提高查找速度与提高更新速度是相互矛盾的。索引可以极大地提高读取数据的速度,但在写数据时,它们却会带来额外的工作。
使用图形界面工具创建和管理索引的方法主要有下面3种:
1.     创建索引向导。可以从向导列表中启动它。
2.     使用索引管理器。与创建索引向导相比,企业管理器的索引管理器是一个非常出色的工具,可以使用它来查看和管理一个表的所有索引。打开它的方法是:选择一个表,然后右击或者“操作”菜单上选择“所有任务”〉“管理索引”菜单项即可。
3.     表的“属性”对话框。该对话框的“索引/键”选项卡就是用来完成这项工作的。(注意:这个“索引/键”选项卡的界面设计稍微有点问题,即在其顶部的组合框用于选择要修改的索引,但却没有“确定”或者“应用”按钮,但无论在其中输入什么,都会随同在表设计器中所做的其它改变一起应用到表上的。
(二)理解索引
SQL Server使用两种基本类型的索引:聚集索引和非聚集索引。这两种索引都可以对多个列进行索引,在这种情况下也可以称它们为组合索引。
1.     非聚集索引。在代码中创建非聚集索引的方法是:使用CREATE INDEX DDL命令,并指定相应的索引名,以及要进行索引的表和列。如:
CREATE NONCLUSTERED INDEX IxOrderNumber
   ON dbo.[Order] (OrderNumber)
       在计算列上也可以创建索引,但是,如果想要在计算列或者索引视图上创建和修改索引,必须先将quoted_identifier选项设置为on
2.     聚集索引。聚集索引将表中的记录行与索引键值以同样的顺序加以存储。电话簿就是一个很好的聚集索引的例子,其中数据和索引都以同样的顺序加以存储。在聚集索引的内部,SQL Server合并了索引页的叶节点与数据页,也正由于数据只可能有一种物理存储顺序,因此每个表只能有一个聚集索引。
注:(1)合并聚集索引的叶节点与数据具有两个作用。首先,通过聚集索引检索数据只需要更少的逻辑读取的次数。其次,任意非聚集索引都将指向聚集索引的ID,而不再需要指向数据页。
 (2)聚集索引将具有同样索引键值的记录行集中到尽可能少的数据页中,因而减少了检索一组记录时需要读取数据的页数,基于同样的原因,对于只返回一行记录的查询,使用聚集索引将不会明显地提高性能。从中我们可总结出:因为在每个表上只能创建一个聚集索引,所以它也是一种宝贵的性能资源,只有在那些经常作为条件查询一组记录行的列上才应该建立聚集索引。
在代码中创建聚集索引的方法与创建非聚集索引的方法非常类似,如:
CREATE CLUSTERED INDEX IxOrderID
   ON dbo.OrderDetail (OrderID)
删除索引的方法是:使用DROP INDEX命令,并指定相应的表名和索引名:
DROP INDEX OrderDetail.IxOrderID
3. 组合索引。组合索引是拥有多个索引列的聚集或者非聚集索引,正因如此,只有在创建表之后,才能使用CREATE INDEX DDL命令来创建它们。如:
CREATE CLUSTERED INDEX IxGuideName
   ON dbo.Guide (LastName, FirstName)
在组合索引中,索引列排列的先后顺序非常重要。因为,只有这样的一些查询才能够使用组合索引:它们在查询条件中所包含的索引列在组合索引中是从第一个索引列开始按照从左到右的顺序依次排列的。
最后,在文章快结束的时候,再介绍一点(这一点好好重要噢!~):索引填充因子(FillFactor)应该设置为多少才最合适,取决于数据库的用途。如果数据库主要用于数据检索,就应当将填充因子设置为较大的值以尽可能填满一个索引页的空间;反之,如果需要对表进行大量的插入操作,在索引页上保留一些空间就可以提高更新操作的性能;还有,如果对于表插入操作的数量变化幅度较大,将填充因子设置为一个中间的值,并选择填充索引(PAD_INDEX)选项就比较合适了!
CREATE INDEX命令中也可以指定填充因子和填充索引选项。例如下面的代码在[Order]表的OrderNumber列上创建一个索引,并指定在叶节点和中间级节点上都保留15%的自由空间:
CREATE NONCLUSTERED INDEX IxOrderNumber
     ON dbo.[Order] ((OrderNumber)
         WITH TILLFACTOR=85, PAD_INDEX
好了,今天就到这里吧!我去吃饭了,哈哈!~
 
 

相关文章推荐

浅谈MongoDB游标和索引

因为本人专业方向不是数据库,只是在实验搭建时会用到一点,所以探讨的难免有些肤浅,只是记录一些遇到的问题和解决方法供大家讨论。之前写过一篇VS2010下配置C++ driver的文章,也许是我操作新版本...

从MySQL Bug#67718浅谈B+树索引的分裂优化

问题背景 今天,看到Twitter的DBA团队发布了其最新的MySQL分支:Changes in Twitter MySQL 5.5.28.t9,此分支最重要的一个改进,就是修复了MySQL ...

细谈——索引重点内容

一,概念: 百度百科是这样定义的:索引对数据库库表中的一列或多列的值进行排序的一种结构,使用索引可以快速访问数据表中的特定信息。 (其实,对索引稍加了解的人都知道:数据库索引通俗来说就是数据库查询...

浅谈数据库索引

数据库索引是为了增加查询速度而对表字段附加的一种标识。见过很多人机械的理解索引的概念,认为增加索引只有好处没有坏处。这里想把之前的索引学习笔记总结一下:     首先明白为什么索引会增加速度,D...
  • oyxm0
  • oyxm0
  • 2012年03月20日 00:55
  • 475

oracle索引浅谈

针对oracle索引做的一个文章,本文章持续更新。

谈索引

索引,索,检索之意,引,引用之意。百度百科的解释如下: 索引,指将文献中具有检索意义的事项(可以是人名、地名、词语、概念、或其他事项)按照一定方式有序编排起来,以供检索的工具书。从上面的文字解释中,...

浅谈MySQL索引背后的数据结构及算法

摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,...
  • zxh87
  • zxh87
  • 2013年06月06日 17:38
  • 508

浅谈数据库主键和外键及索引

1、主键: 若某一个属性组(注意是组)能唯一标识一条记录,该属性组就是一个主键。主键不能重复,且只能有一个,也不允许为空。定义主键主要是为了维护关系数据库的完整性。 2、外键: 外键用于与另一张表...

老司机好车谈 —— 对日嵌入式开发使用工具索引

老司机好车谈作为十年的嵌入式开发经验者,简单记录一下顺手的工具。 属于个人杂记性质,不管趁手不趁手都随便写写。代码部分 代码编辑 :这个比较多,必须做张表 工具 Comment Ultra...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谈“索引”
举报原因:
原因补充:

(最多只允许输入30个字)