`
streamsong
  • 浏览: 79896 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

我们为什么要用索引,用索引为什么比不用索引快

 
阅读更多

今天分析客户的oracle数据库,发现很多表上都建立了复合索引,而SQL的执行计划很多都没有走索引或者都是索引扫,这显然是不对的,通过分析SQL发现,SQL的条件很多都不满足复合索引,也可以说是复合索引简历的不正确,在请教老杨(杨廷琨)之后,使我明白了很久以来一直没有关注过也没仔细思考过的问题,就是我们为什么要用索引,都说用索引会加快数据库的速度,那么为什么会加快速度呢?我想这个问题很多人都会回答因为索引记录了表中的ROWID,所以快,那么在有些情况下,索引的大小甚至比表还大,全扫索引还不如全扫表呢!

      经过老杨的细心指点,我才真正的明白、理解、记住(以前曾看过索引的资料,时间长都忘啦)。

      老杨问我如果一张表上没有索引,你要查ID=5的记录,数据库会怎么做?

      我说数据库会先根据数据字典找到这张表,然后根据表头的记录找到这张表的数据块,然后每个数据块去找。

      老杨:会把所有的数据块都扫一遍吗?
      我:有可能会,有可能不会。(我回答错啦)

      老杨:那么什么时候会全扫?什么时候不全扫?

      我:有可能扫第一个块的时候就找到了ID=5的行,就不去扫其他的块啦,也有可能扫到最后的一个块才找到D=5的信息,就全扫啦。

      老杨:可能是我问你的问题误导你了,我一说ID=5你就以为ID是主键,那么如果找的不是ID=5而是name=张三的呢?

      我:那样会全扫。

      老杨:为什么会全扫,可能在找第一个快的时候就找到了name=张三的信息啦。

      我:因为name=张三的行有很多重复的。

      老杨:这就对啦,如果不用索引,即使是找一条数据库里没有的数据,oracle也会把表的所有块都扫一遍,然后返回结果,索引记录了行的信息,所以有时候我们要用索引。那么用索引为什么会提高性能呢?

      老杨:因为索引(以B树索引为例)是树状结构,最上面的是根,根下面是枝,枝再下面是叶,根会记录比如1-20的ID在第一个枝上,21-40在第二个枝上... ... ,这样我们找ID=5的数据,走索引的话,通过扫描根就直接去找第一个枝,通过扫描第一个枝找到所有ID=5的行的ROWID找到所有ID=5的数据。而且,索引是有序的(这也是有些时候索引会比表大的一个原因),这样就提高了效率。

       以上不是原话,原话记不清啦,是我理解的大概意思!

2
1
分享到:
评论
6 楼 streamsong 2011-07-04  
王雨尘 写道
 

的确是说索引是排序的,我漏掉啦
5 楼 heerwa 2011-07-02  
4 楼 liulanghan110 2011-07-02  
那么用索引为什么会提高性能呢?
因为索引(以B树索引为例)是树状结构。
这回答搞笑吧?这么回答好些吧
那么用索引为什么会提高性能呢?
因为索引是有序的。

3 楼 王雨尘 2011-07-01  
 
2 楼 pangpang514 2011-07-01  
  居然和强哥合影过。。。。佩服!
1 楼 pangpang514 2011-07-01  
   

相关推荐

Global site tag (gtag.js) - Google Analytics