关于索引的问题(低级问题,高手勿怪)都说有索引会比没有索引的执行效率更快。看了一些资料,下面是MSDN上的解释:查询优化器如何使用索引设计良好的索引可以减少磁盘 I/O 操作,并且消耗的系统资源也较少,从而可以提高查询性能。对于包含 SELECT、UPDATE 或 DELETE 语句的各种查询,索引会很有用。例如,在 AdventureWorks 数据库中执行的查询 SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250。执行此查询时,查询优化器评估可用于检索数据的每个方法,然后选择最有效的方法。可能采用的方法包括扫描表和扫描一个或多个索引(如果有)。扫描表时,查询优化器读取表中的所有行,并提取满足查询条件的行。扫描表会有许多磁盘 I/O 操作,并占用大量资源。但是,如果查询的结果集是占表中较高百分比的行,扫描表会是最为有效的方法。查询优化器使用索引时,搜索索引键列,查找到查询所需行的存储位置,然后从该位置提取匹配行。通常,搜索索引比搜索表要快很多,因为索引与表不同,一般每行包含的列非常少,且行遵循排序顺序。查询优化器在执行查询时通常会选择最有效的方法。但如果没有索引,则查询优化器必须扫描表。您的任务是设计并创建最适合您的环境的索引,以便查询优化器可以从多个有效的索引中选择。
有个地方一直没明白,同样一张表,如果没有索引,将进行全表扫描。(一行一行扫,没顺序)如果有索引的话,不也是一行一行扫吗?只不过是有顺序的。这样不也得扫描一个表中的每一行吗?为什么说搜索速度会快得多呢?到底是哪里节省的时间呢?

解决方案 »

  1.   

    索引是保存在物理空间上的,你通常建个主键就会自动建个主键索引,实际上起作用的是主键索引而不是主键,因为索引是保存在物理空间上的。
    ORACLE实际上是使用了一个复杂的自平衡B-tree结构,因此通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率.
    同时要注意的是索引也要定期维护的,每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,因此大量delete或insert的时候最好先把索引去掉,因为delete或insert要维护索引而使速度减慢。
      

  2.   

    十分感谢kinglht(爱新觉罗至尊宝)也就是说,在查询有索引的表的时候,有些行数据根本就没有被扫描到是吗?再问个问题,当一个表建立索引之后,是不是就相当于把这个表进行了一次排序,每一行都对应唯一的一个序号?如果是这样的话,那么如果建立索引之后,又重新insert了一条数据,那么以前每一行所对应的索引的序号是不是要进行重新排序呢?~
      

  3.   

    谢谢TodayZ(天山浪子) 索引的建立是针对一个表而言的,而并非是针对某一列而言的,是吗?对一个表建立了索引,是不是就相当于对一篇文章做了一个目录,当查询的时候,不搜索表,而是搜索目录,由目录对应着每一行的数据?
      

  4.   

    再次感谢:)那么,建立了索引,就是将表的部分字段拿出来重新组织排序。如果此时插入一个字段,或者说对某个索引键值改变的时候,是不是物理空间里的索引就要重新排序?而不是简单的在原有的索引最末尾加上一个新键值,是这样吗?因为如此,insert,update操作如果比较频繁的话,就会影响速度,是因为索引重新排序占用的,而查询时,还是会那么快。不知道这样理解对吗?~:)
      

  5.   

    如果进行大量insert和delete之后,会影响一些效率,这时候通常要将索引rebuild一下。
    ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>
      

  6.   

    1、如果此时插入一个字段,或者说对某个索引键值改变的时候,是不是物理空间里的索引就要重新排序?而不是简单的在原有的索引最末尾加上一个新键值,是这样吗?
    键值的改变会影响索引,但不会重新排序,如果这样就太夸张了。上面说过,索引通常是B+树,索引的调整是采用B+树数据调整规则。简单的讲绝大部分情况增加一个记录只会影响一个索引块,影响没有你想象的大,呵呵。详细情况你可以参考《数据结构》中相关内容。2、因为如此,insert,update操作如果比较频繁的话,就会影响速度,是因为索引重新排序占用的,而查询时,还是会那么快。
    这个说法是对的,过多的索引会降低数据操作的速度,但会提高查询的速度,这需要你在数据操作和查询中进行权衡,总之是过犹不及啊。