关于索引的问题(低级问题,高手勿怪)都说有索引会比没有索引的执行效率更快。看了一些资料,下面是MSDN上的解释:查询优化器如何使用索引设计良好的索引可以减少磁盘 I/O 操作,并且消耗的系统资源也较少,从而可以提高查询性能。对于包含 SELECT、UPDATE 或 DELETE 语句的各种查询,索引会很有用。例如,在 AdventureWorks 数据库中执行的查询 SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250。执行此查询时,查询优化器评估可用于检索数据的每个方法,然后选择最有效的方法。可能采用的方法包括扫描表和扫描一个或多个索引(如果有)。扫描表时,查询优化器读取表中的所有行,并提取满足查询条件的行。扫描表会有许多磁盘 I/O 操作,并占用大量资源。但是,如果查询的结果集是占表中较高百分比的行,扫描表会是最为有效的方法。查询优化器使用索引时,搜索索引键列,查找到查询所需行的存储位置,然后从该位置提取匹配行。通常,搜索索引比搜索表要快很多,因为索引与表不同,一般每行包含的列非常少,且行遵循排序顺序。查询优化器在执行查询时通常会选择最有效的方法。但如果没有索引,则查询优化器必须扫描表。您的任务是设计并创建最适合您的环境的索引,以便查询优化器可以从多个有效的索引中选择。
有个地方一直没明白,同样一张表,如果没有索引,将进行全表扫描。(一行一行扫,没顺序)如果有索引的话,不也是一行一行扫吗?只不过是有顺序的。这样不也得扫描一个表中的每一行吗?为什么说搜索速度会快得多呢?到底是哪里节省的时间呢?
有个地方一直没明白,同样一张表,如果没有索引,将进行全表扫描。(一行一行扫,没顺序)如果有索引的话,不也是一行一行扫吗?只不过是有顺序的。这样不也得扫描一个表中的每一行吗?为什么说搜索速度会快得多呢?到底是哪里节省的时间呢?
ORACLE实际上是使用了一个复杂的自平衡B-tree结构,因此通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率.
同时要注意的是索引也要定期维护的,每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,因此大量delete或insert的时候最好先把索引去掉,因为delete或insert要维护索引而使速度减慢。
ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>
键值的改变会影响索引,但不会重新排序,如果这样就太夸张了。上面说过,索引通常是B+树,索引的调整是采用B+树数据调整规则。简单的讲绝大部分情况增加一个记录只会影响一个索引块,影响没有你想象的大,呵呵。详细情况你可以参考《数据结构》中相关内容。2、因为如此,insert,update操作如果比较频繁的话,就会影响速度,是因为索引重新排序占用的,而查询时,还是会那么快。
这个说法是对的,过多的索引会降低数据操作的速度,但会提高查询的速度,这需要你在数据操作和查询中进行权衡,总之是过犹不及啊。