日期:2014-05-17  浏览次数:20762 次

关于索引的理解
关于索引的问题(低级问题,高手勿怪)

都说有索引会比没有索引的执行效率更快。看了一些资料,下面是MSDN上的解释:

查询优化器如何使用索引

设计良好的索引可以减少磁盘   I/O   操作,并且消耗的系统资源也较少,从而可以提高查询性能。对于包含   SELECT、UPDATE   或   DELETE   语句的各种查询,索引会很有用。例如,在   AdventureWorks   数据库中执行的查询   SELECT   Title,   HireDate   FROM   HumanResources.Employee   WHERE   EmployeeID   =   250。执行此查询时,查询优化器评估可用于检索数据的每个方法,然后选择最有效的方法。可能采用的方法包括扫描表和扫描一个或多个索引(如果有)。

扫描表时,查询优化器读取表中的所有行,并提取满足查询条件的行。扫描表会有许多磁盘   I/O   操作,并占用大量资源。但是,如果查询的结果集是占表中较高百分比的行,扫描表会是最为有效的方法。

查询优化器使用索引时,搜索索引键列,查找到查询所需行的存储位置,然后从该位置提取匹配行。通常,搜索索引比搜索表要快很多,因为索引与表不同,一般每行包含的列非常少,且行遵循排序顺序。

查询优化器在执行查询时通常会选择最有效的方法。但如果没有索引,则查询优化器必须扫描表。您的任务是设计并创建最适合您的环境的索引,以便查询优化器可以从多个有效的索引中选择。


有个地方一直没明白,同样一张表,如果没有索引,将进行全表扫描。(一行一行扫,没顺序)

如果有索引的话,不也是一行一行扫吗?只不过是有顺序的。这样不也得扫描一个表中的每一行吗?为什么说搜索速度会快得多呢?到底是哪里节省的时间呢?


------解决方案--------------------
如果进行大量insert和delete之后,会影响一些效率,这时候通常要将索引rebuild一下。
ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>
------解决方案--------------------
1、如果此时插入一个字段,或者说对某个索引键值改变的时候,是不是物理空间里的索引就要重新排序?而不是简单的在原有的索引最末尾加上一个新键值,是这样吗?
键值的改变会影响索引,但不会重新排序,如果这样就太夸张了。上面说过,索引通常是B+树,索引的调整是采用B+树数据调整规则。简单的讲绝大部分情况增加一个记录只会影响一个索引块,影响没有你想象的大,呵呵。详细情况你可以参考《数据结构》中相关内容。

2、因为如此,insert,update操作如果比较频繁的话,就会影响速度,是因为索引重新排序占用的,而查询时,还是会那么快。
这个说法是对的,过多的索引会降低数据操作的速度,但会提高查询的速度,这需要你在数据操作和查询中进行权衡,总之是过犹不及啊。